<!DOCTYPE html>
<html lang='zh-CN'>
<head>
<title>mblog: mblog开源免费的博客系统, Java语言开发, 支持mysql/h2数据库, 采用spring-boot、jpa、shiro、bootstrap等流行框架开发</title>
<link href="https://assets.gitee.com/assets/favicon-9007bd527d8a7851c8330e783151df58.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="https://gitee.com/mtons/mblog" rel="canonical" />
<meta content='gitee.com/mtons/mblog git https://gitee.com/mtons/mblog.git' name='go-import'>
<meta charset='utf-8'>
<meta content='always' name='referrer'>
<meta content='Gitee' property='og:site_name'>
<meta content='Object' property='og:type'>
<meta content='http://gitee.com/mtons/mblog?_from=gitee_search' property='og:url'>
<meta content='https://portrait.gitee.com/uploads/avatars/user/38/116277_mtons_1578918237.jpg' itemprop='image' property='og:image'>
<meta content='mtons/mblog' itemprop='name' property='og:title'>
<meta content='mblog开源免费的博客系统, Java语言开发, 支持mysql/h2数据库, 采用spring-boot、jpa、shiro、bootstrap等流行框架开发' property='og:description'>
<meta content='mblog,Java' name='Keywords'>
<meta content='mblog开源免费的博客系统, Java语言开发, 支持mysql/h2数据库, 采用spring-boot、jpa、shiro、bootstrap等流行框架开发' itemprop='description' name='Description'>

<meta content="IE=edge" http-equiv="X-UA-Compatible" />
<meta content="authenticity_token" name="csrf-param" />
<meta content="L4uP5ye1IV9lzqssNsW6DpxBmBq9gtAvav9QZANRx1Q=" name="csrf-token" />

<link href="https://assets.gitee.com/assets/application-7425b0a587e270d9679225b6e467647c.css" media="all" rel="stylesheet" />
<script>
//<![CDATA[
window.gon = {};gon.locale="zh-CN";gon.sentry_dsn=null;gon.baidu_register_hm_push=null;gon.sensor={"server_url":"https://haveaniceday.gitee.com:3443/sa?project=production"};gon.info={"controller_path":"projects","action_name":"show","current_user":false};gon.tour_env={"current_user":null,"action_name":"show","original_url":"http://gitee.com/mtons/mblog?_from=gitee_search","controller_path":"projects"};gon.http_clone="https://gitee.com/mtons/mblog.git";gon.user_project="mtons/mblog";gon.manage_branch="管理分支";gon.manage_tag="管理标签";gon.enterprise_id=0;gon.create_reaction_path="/mtons/mblog/reactions";gon.cp="点击复制";gon.aready_cp="已复制";gon.ref="master";
//]]>
</script>
<script src="https://assets.gitee.com/assets/static/sensor-a8642a734004a5ebe37533e9cd7bc4a4.js"></script>
<script src="https://assets.gitee.com/assets/static/sentry-5.1.0-109ee3d8895a239331efcf947ba7f5d8.js"></script>
<script src="https://assets.gitee.com/assets/application-763b937a3c8274e3b10db99f28e036df.js"></script>
<script src="https://assets.gitee.com/assets/lib/jquery.timeago.zh-CN-9c36ca7c4899a28168320613879d208a.js"></script>

<link href="https://assets.gitee.com/assets/projects/application-6889ef1b1e62fff81035e0ded3ac9c74.css" media="all" rel="stylesheet" />
<script src="https://assets.gitee.com/assets/projects/app-d220e3e83d3aaf784d1956965b72de5d.js"></script>

<script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script>
  var title = document.title.replace(/( - Gitee| - 码云)$/, '')
      imgUrl = '';
  
  document.addEventListener('DOMContentLoaded', function(event) {
    var imgUrlEl = document.querySelector('.readme-box .markdown-body > img, .readme-box .markdown-body :not(a) > img');
    imgUrl = imgUrlEl && imgUrlEl.getAttribute('src');
  
    if (!imgUrl) {
      imgUrlEl = document.querySelector('meta[itemprop=image]');
      imgUrl = imgUrlEl && imgUrlEl.getAttribute('content'); 
      imgUrl = imgUrl || "https://gitee.com/static/images/logo_themecolor.png";
    }
  
    wx.config({
      debug: false,
      appId: "wxff219d611a159737",
      timestamp: "1607144687",
      nonceStr: "dc1f4de7e8085b05019d7ff47d59a243",
      signature: "9fc38f158177266c4cc49d8f55ed283d00ed08e5",
      jsApiList: [
        'onMenuShareTimeline',
        'onMenuShareAppMessage'
      ]
    });
  
    wx.ready(function () {
      wx.onMenuShareTimeline({
        title: title, // 分享标题
        link: "https://gitee.com/mtons/mblog?_from=gitee_search", // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
        imgUrl: imgUrl // 分享图标
      });
      wx.onMenuShareAppMessage({
        title: title, // 分享标题
        link: "https://gitee.com/mtons/mblog?_from=gitee_search", // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
        desc: document.querySelector('meta[name=Description]').getAttribute('content'),
        imgUrl: imgUrl // 分享图标
      });
    });
    wx.error(function(res){
      console.error('err', res)
    });
  })
</script>

<script type='text/x-mathjax-config'>
MathJax.Hub.Config({
  tex2jax: {
    inlineMath: [['$','$'], ['\\(','\\)']],
    displayMath: [["$$","$$"],["\\[","\\]"]],
    processEscapes: true,
    skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'],
    ignoreClass: "container|files",
    processClass: "markdown-body"
  }
});
</script>
<script src="https://assets.gitee.com/uploads/resources/MathJax-2.7.2/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

<script>
  (function () {
    var messages = {
      'zh-CN': {
        addResult: '增加 <b>{term}</b>',
        count: '已选择 {count}',
        maxSelections: '最多 {maxCount} 个选择',
        noResults: '未找到结果',
        serverError: '连接服务器时发生错误'
      },
      'zh-TW': {
        addResult: '增加 <b>{term}</b>',
        count: '已選擇 {count}',
        maxSelections: '最多 {maxCount} 個選擇',
        noResults: '未找到結果',
        serverError: '連接服務器時發生錯誤'
      }
    }
  
    if (messages[gon.locale]) {
      $.fn.dropdown.settings.message = messages[gon.locale]
    }
  }());
</script>

<script>
  var userAgent = navigator.userAgent;
  var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1;
  if(isLessIE11){
    var can_access = ""
    if (can_access != "true"){
      window.location.href = "/incompatible.html";
    }
  }
</script>
</head>

<body class='git-project lang-zh-CN large'>
<header class='common-header fixed noborder' id='git-header-nav'>
<div class='ui container'>
<div class='ui menu header-menu'>
<div class='git-nav-expand-bar'>
<i class='iconfont icon-mode-table'></i>
</div>
<div class='gitee-nav__sidebar'>
<div class='gitee-nav__sidebar-container'>
<div class='gitee-nav__sidebar-top'>
<div class='gitee-nav__avatar-box'></div>
<div class='gitee-nav__buttons-box'>
<a class="ui button small fluid orange" href="/login">登录</a>
<a class="ui button small fluid basic is-register" href="/signup">注册</a>
</div>
</div>
<div class='gitee-nav__sidebar-middle'>
<div class='gitee-nav__sidebar-list'>
<ul>
<li class='gitee-nav__sidebar-item'>
<a href="/explore"><i class='iconfont icon-ic-discover'></i>
<span class='gitee-nav__sidebar-name'>开源软件</span>
</a></li>
<li class='gitee-nav__sidebar-item'>
<a href="/enterprises"><i class='iconfont icon-ic-enterprise'></i>
<span class='gitee-nav__sidebar-name'>企业版</span>
</a></li>
<li class='gitee-nav__sidebar-item'>
<a href="/education"><i class='iconfont icon-ic-education'></i>
<span class='gitee-nav__sidebar-name'>高校版</span>
</a></li>
<li class='gitee-nav__sidebar-item split-line'></li>
<li class='gitee-nav__sidebar-item'>
<a href="/search"><i class='iconfont icon-ic-search'></i>
<span class='gitee-nav__sidebar-name'>搜索</span>
</a></li>
<li class='gitee-nav__sidebar-item'>
<a href="/help"><i class='iconfont icon-help-circle'></i>
<span class='gitee-nav__sidebar-name'>帮助中心</span>
</a></li>
<li class='gitee-nav__sidebar-item'>
<a href="/terms"><i class='iconfont icon-file'></i>
<span class='gitee-nav__sidebar-name'>使用条款</span>
</a></li>
<li class='gitee-nav__sidebar-item'>
<a href="/about_us"><i class='iconfont icon-issuepx'></i>
<span class='gitee-nav__sidebar-name'>关于我们</span>
</a></li>
</ul>
</div>
</div>
<div class='gitee-nav__sidebar-bottom'>
<div class='gitee-nav__sidebar-close-button'>
<i class='fa fa-angle-double-left'></i>
</div>
</div>
</div>
</div>

<div class='item gitosc-logo'>
<a href="/"><img alt='Gitee — 基于 Git 的代码托管和研发协作平台' class='ui inline image' height='28' src='/static/images/logo.svg?t=158106664' title='Gitee — 基于 Git 的代码托管和研发协作平台' width='95'>
<img alt='Gitee — 基于 Git 的代码托管和研发协作平台' class='ui inline black image' height='28' src='/static/images/logo-black.svg?t=158106664' title='Gitee — 基于 Git 的代码托管和研发协作平台' width='95'>
</a></div>
<a class="item " href="/explore" title="开源软件">开源软件
</a><a class="item " href="/enterprises" title="企业版">企业版
<sup class='ui red label'>
特惠
</sup>
</a><a class="item " href="/education" title="高校版">高校版
</a><a class="item" href="https://blog.gitee.com/" id="gitee-blog" target="_blank" title="博客">博客
</a><div class='center responsive-logo'>
<a href="/"><img alt='Gitee — 基于 Git 的代码托管和研发协作平台' class='ui inline image' height='24' src='/static/images/logo.svg?t=158106664' title='Gitee — 基于 Git 的代码托管和研发协作平台' width='85'>
<img alt='Gitee — 基于 Git 的代码托管和研发协作平台' class='ui inline black image' height='24' src='/static/images/logo-black.svg?t=158106664' title='Gitee — 基于 Git 的代码托管和研发协作平台' width='85'>
</a></div>
<div class='right menu userbar' id='git-nav-user-bar'>
<form accept-charset="UTF-8" action="/search" class="ui item" data-text-filter="搜索格式不正确" data-text-require="搜索关键字不能少于1个" id="navbar-search-form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>
<input id="navbar-search-type" name="type" type="hidden" />
<input id="fork_filter" name="fork_filter" type="hidden" value="on" />
<div class='ui search'>
<input class="prompt" id="navbar-search-input" name="q" placeholder="搜开源" type="text" value="" />
</div>
</form>

<script>
  var can_search_in_repo = 1,
      repo = "VFdwWk0wNTZSVEpaVkdNeVRUSlpQV0UzTmpObWE3NjNm",
      reponame = "mtons/mblog";
  
  $(function() {
    var $search = $('#navbar-search-form .ui.search');
    $search.search({
      apiSettings: {
        url: '/search/relative_project?q={query}',
        onResponse: function (res) {
          if (res && res.status === 200 && res.data) {
            var query = htmlSafe($search.search('get value'));
  
            res.data.map(function (item) {
              item.path_ns = '/' + item.path_ns;
              item.icon = 'iconfont icon-project-public';
            });
            res.data.unshift({
              name_ns: "在全站搜索 <b class='hl'>" + query +"</b> 相关项目",
              path_ns: '/search?fork_filter=on&q=' + query,
              icon: 'iconfont icon-search'
            });
            if(can_search_in_repo == 1) {
              res.data.unshift({
                name_ns: "在当前仓库搜索 <b class='hl'>" + query +"</b> 相关代码",
                path_ns: '/search?type=code&q=' + query + '&repo=' + repo + '&reponame=' + reponame,
                icon: 'iconfont icon-search'
              });
            }
            return res;
          } else {
            return { data: [] };
          }
        }
      },
      fields: {
        results: 'data',
        description: 'name_ns',
        url: 'path_ns',
        icon: 'icon'
      },
      minCharacters: 1,
      maxResults: 10,
      searchDelay: 250,
      showNoResults: false,
      transition: 'fade'
    });
  });
</script>

<a class="item git-nav-user__login-item" href="/login" sa_evt="login_show" sa_referrer_action="站导航右上角-登录按钮" sa_referrer_type="仓库页面" sa_referrer_url="">登录
</a><a class="item git-nav-user__register-item" href="/signup" sa_evt="register_show" sa_referrer_action="站导航右上角-注册按钮" sa_referrer_type="仓库页面" sa_referrer_url="">注册
</a><script>
  $('.destroy-user-session').on('click', function() {
    $.cookie('access_token', null, { path: '/' });
  })
</script>

</div>
</div>
</div>
</header>
<script>
  Gitee.initNavbar()
  Gitee.initRepoRemoteWay()
</script>

<script>
  var userAgent = navigator.userAgent;
  var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1;
  if(isLessIE11){
    var can_access = ""
    if (can_access != "true"){
      window.location.href = "/incompatible.html";
    }
  }
</script>

<div class='fixed-notice-infos'>
<div class='all-messages'>
</div>
<div class='ui container'>
<div class='flash-messages' id='messages-container'></div>
</div>
<script>
  (function() {
    $(function() {
      var $error_box, alertTip, notify_content, notify_options, template;
      template = '<div data-notify="container" class="ui {0} message" role="alert">' + '<i data-notify="dismiss" class="close icon"></i>' + '<span data-notify="message">{2}</span>' + '</div>';
      notify_content = null;
      notify_options = {};
      alertTip = '';
      $error_box = $(".flash_error.flash_error_box");
      if (notify_options.type === 'error' && $error_box.length > 0 && !$.isEmptyObject(notify_content.message)) {
        if (notify_content.message === 'captcha_fail') {
          alertTip = "验证码不正确";
        } else if (notify_content.message === 'captcha_expired') {
          alertTip = "验证码已过期，请点击刷新";
        } else if (notify_content.message === 'not_found_in_database') {
          alertTip = "帐号或者密码错误";
        } else if (notify_content.message === 'not_found_and_show_captcha') {
          alertTip = "帐号或者密码错误";
        } else if (notify_content.message === 'phone_captcha_fail') {
          alertTip = "手机验证码不通过";
        } else {
          alertTip = notify_content.message;
        }
        return $error_box.html(alertTip).show();
      } else if (notify_content) {
        if ("show" === 'third_party_binding') {
          return $('#third_party_binding-message').html(notify_content.message).addClass('ui message red');
        }
        notify_options.delay = 3000;
        notify_options.template = template;
        notify_options.offset = {
          x: 10,
          y: 30
        };
        notify_options.element = '#messages-container';
        return $.notify(notify_content, notify_options);
      }
    });
  
  }).call(this);
</script>

</div>
<script>
  (function() {
    $(function() {
      var setCookie;
      setCookie = function(name, value) {
        $.cookie(name, value, {
          path: '/',
          expires: 365
        });
      };
      $('#remove-bulletin, #remove-bulletin-dashboard').on('click', function() {
        setCookie('remove_bulletin', "gitee-maintain-1606904356");
        $('#git-bulletin').hide();
      });
      $('#remove-member-bulletin').on('click', function() {
        setCookie('remove_member_bulletin', "gitee_member_bulletin");
        $(this).parent().hide();
      });
      return $('#remove-gift-bulletin').on('click', function() {
        setCookie('remove_gift_bulletin', "gitee-gift-bulletin");
        $(this).parent().hide();
      });
    });
  
  }).call(this);
</script>
<script>
  function closeMessageBanner(pthis, type, val) {
    var json = {}
  
    val = typeof val === 'undefined' ? null : val
    $(pthis).parent().remove()
    if (type === 'out_of_enterprise_member') {
      json = {type: type, data: val}
    } else if (type === 'enterprise_overdue') {
      json = {type: type, data: val}
    }
    $.post('/profile/close_flash_tip', json)
  }
</script>

<div class='site-content'>
<div class='git-project-header'>
<div class='fixed-notice-infos'>
<div class='ui info icon floating message green' id='fetch-ok' style='display: none'>
<div class='content'>
<div class='header status-title'>
<i class='info icon status-icon'></i>
代码拉取完成，页面将自动刷新
</div>
</div>
</div>
<div class='ui info icon floating message error' id='fetch-error' style='display: none'>
<div class='content'>
<div class='header status-title'>
<i class='info icon status-icon'></i>
<span class='error_msg'></span>
</div>
</div>
</div>
</div>
<div class='ui container'>
<div class='git-project-categories'>
<a href="/explore">开源项目</a>
<span class='symbol'>></span>
<a href="/explore/build-web-system">建站系统</a>
<span class='symbol'>></span>
<a href="/explore/blog">博客系统</a>
<span class='symbol and-symbol'>&</span>
</div>

<div class='git-project-header-details'>
<div class='git-project-header-container'>
<div class='git-project-header-actions'>
<div class='ui tiny modal project-donate-modal' id='project-donate-modal'>
<i class='iconfont icon-close close'></i>
<div class='header'>捐赠</div>
<div class='content'>
捐赠前请先登录
</div>
<div class='actions'>
<a class='ui blank button cancel'>取消</a>
<a class='ui orange ok button' href='/login'>前往登录</a>
</div>
</div>
<div class='ui small modal wepay-qrcode'>
<i class='iconfont icon-close close'></i>
<div class='header'>
扫描微信二维码支付
<span class='wepay-cash'></span>
</div>
<div class='content weqcode-center'>
<img id='wepay-qrcode' src=''>
</div>
<div class='actions'>
<div class='ui cancel blank button'>取消</div>
<div class='ui ok orange button'>
支付完成
</div>
</div>
</div>
<div class='ui mini modal' id='confirm-alipay-modal'>
<div class='header'>支付提示</div>
<div class='content'>
将跳转至支付宝完成支付
</div>
<div class='actions'>
<div class='ui approve orange button'>
确定
</div>
<div class='ui blank cancel button'>
取消
</div>
</div>
</div>

<span class='ui buttons basic watch-container'>
<div class='ui dropdown button js-project-watch' data-watch-type='unwatch'>
<input type='hidden' value=''>
<i class='iconfont icon-watch'></i>
<div class='text'>
Watch
</div>
<i class='dropdown icon'></i>
<div class='menu'>
<a class="item" data-method="post" data-value="unwatch" href="/mtons/mblog/unwatch" rel="nofollow" sa_evt="loginInform_show" sa_referrer_action="Watch" sa_referrer_type="仓库页面" sa_referrer_url=""><i class='iconfont icon-msg-read'></i>
不关注
</a><a class="item" data-method="post" data-value="watching" href="/mtons/mblog/watch" rel="nofollow" sa_evt="loginInform_show" sa_referrer_action="Watch" sa_referrer_type="仓库页面" sa_referrer_url=""><i class='iconfont icon-msg-read'></i>
关注所有动态
</a><a class="disabled item" data-method="post" data-value="releases_only" href="/mtons/mblog/release_only_watch" rel="nofollow" sa_evt="loginInform_show" sa_referrer_action="Watch" sa_referrer_type="仓库页面" sa_referrer_url=""><i class='iconfont icon-msg-read'></i>
仅关注版本发行动态
</a><a class="item" data-method="post" data-value="ignoring" href="/mtons/mblog/ignoring_watch" rel="nofollow" sa_evt="loginInform_show" sa_referrer_action="Watch" sa_referrer_type="仓库页面" sa_referrer_url=""><i class='iconfont icon-msg-read'></i>
关注但不提醒动态
</a></div>
</div>
<style>
  .js-project-watch .text .iconfont {
    display: none; }
  .js-project-watch a, .js-project-watch a:hover {
    color: #000; }
  .js-project-watch .item > .iconfont {
    visibility: hidden;
    margin-left: -10px; }
  .js-project-watch .selected .iconfont {
    visibility: visible; }
  .js-project-watch .menu {
    margin-top: 4px !important; }
</style>
<script>
  $('.js-project-watch').dropdown({
    action: 'select',
    onChange: function(value, text, $selectedItem) {
      var type = value === 'unwatch' ? 'Watch' : 'Watching';
      $(this).children('.text').text(type);
      $(this).dropdown('set selected', value)
    }
  });
</script>

<a class="ui button action-social-count" href="/mtons/mblog/watchers" title="692">692
</a></span>
<span class='basic buttons star-container ui'>
<a class="ui button star" href="/login" sa_evt="loginInform_show" sa_referrer_action="Star" sa_referrer_type="仓库页面" sa_referrer_url=""><i class='iconfont icon-star'></i>
Star
</a><a class="ui button action-social-count " href="/mtons/mblog/stargazers" title="2548">2.5K
</a></span>
<span class='ui basic buttons fork-container' title='无权 Fork 此仓库'>
<a class="ui button fork" href="/login" sa_evt="loginInform_show" sa_referrer_action="Fork" sa_referrer_type="仓库页面" sa_referrer_url="" title="你必须登录后才可以fork一个仓库"><i class='iconfont icon-fork'></i>
Fork
</a><a class="ui button action-social-count disabled-style" href="/mtons/mblog/members" title="1404">1.4K
</a></span>
</div>
<h2 class='git-project-title'>
<span class="project-title"><i class="project-icon iconfont icon-project-public" title="这是一个公开仓库"></i> <a class="author" href="/mtons" title="mtons">mtons</a> / <a class="repository" href="/mtons/mblog" sa_evt="repoClick" sa_location="仓库页面" sa_repo_id="267716" sa_url="" style="padding-bottom: 0px" target="" title="mblog">mblog</a></span><span class="project-badges"><a class="git-project-recommend-badge" href="/explore" title="已被推荐"><i class='iconfont icon-recommended'></i>
</a><style>
  .gitee-modal {
    width: 500px !important; }
</style>
</span>
<input id="recomm_at" name="recomm_at" type="hidden" value="2015-01-08 17:32" />
<input id="project_title" name="project_title" type="hidden" value="mtons/mblog" />
</h2>
</div>

</div>
</div>
<script>
  var title_import_url = "https://github.com/langhsu/mblog.git";
  var title_post_url = "/mtons/mblog/update_import";
  var title_fork_url = "/mtons/mblog/sync_fork";
  var title_project_path = "mblog";
  var title_p_name = "mblog";
  var title_p_id= "267716";
  var title_description = "mblog开源免费的博客系统, Java语言开发, 支持mysql/h2数据库, 采用spring-boot、jpa、shiro、bootstrap等流行框架开发";
  var title_form_authenticity_token = "L4uP5ye1IV9lzqssNsW6DpxBmBq9gtAvav9QZANRx1Q=";
  var watch_type = "unwatch";
  
  $('.js-project-watch').dropdown('set selected', watch_type);
  $('.checkbox.sync-wiki').checkbox();
</script>
<style>
  i.loading {
    -webkit-animation: icon-loading 1.2s linear infinite;
    animation: icon-loading 1.2s linear infinite;
  }
  .qrcode_cs {
    float: left;
  }
  .check-sync-wiki {
    float: left;
    height: 28px;
    line-height: 28px;
  }
  .sync-wiki-warn {
    color: #e28560;
  }
</style>

<div class='git-project-nav'>
<div class='ui container'>
<div class='ui secondary pointing menu'>
<a class="item active" href="/mtons/mblog"><i class='iconfont icon-code'></i>
代码
</a><a class="item " href="/mtons/mblog/issues"><i class='iconfont icon-task'></i>
Issues
<span class='ui mini circular label'>
13
</span>
</a><a class="item big-wide " href="/mtons/mblog/pulls"><i class='iconfont icon-pull-request'></i>
Pull Requests
<span class='ui mini circular label'>
1
</span>
</a><a class="item " href="/mtons/mblog/wikis"><i class='iconfont icon-wiki'></i>
Wiki
<span class='ui mini circular label'>
7
</span>
</a><a class="item  " href="/mtons/mblog/graph/master"><i class='iconfont icon-statistics'></i>
统计
</a><div class='item project-devops-item'>
<div class='ui pointing top right dropdown project-devops-dropdown'>
<div class='text'>
<i class='iconfont icon-devops'></i>
DevOps
</div>
<i class='dropdown icon'></i>
<div class='menu' style='display:none'>
<a class="item" href="/mtons/mblog/gitee_go"><img alt="Giteego" src="https://assets.gitee.com/assets/giteego-7ec42270742374f05850d0d3ad09e303.png" />
<div class='item-title'>
Gitee Go
</div>
</a><a class="item" href="https://gitee.com/help/articles/4285" target="_blank"><img alt="Baidu efficiency cloud" src="https://assets.gitee.com/assets/baidu_efficiency_cloud-81a98c2eb67fac83b1453ca3d2feb326.svg" />
<div class='item-title'>
百度效率云
</div>
</a><a class="item" href="https://gitee.com/help/articles/4318" target="_blank"><img alt="Cloudbase" src="https://assets.gitee.com/assets/cloudbase-1197b95ea3398aff1df7fe17c65a6d42.png?20200925" />
<div class='item-title'>
腾讯云托管
</div>
</a><a class="item" href="https://gitee.com/help/articles/4193" target="_blank"><img alt="Jenkins for gitee" src="https://assets.gitee.com/assets/jenkins_for_gitee-554ec65c490d0f1f18de632c48acc4e7.png" />
<div class='item-title'>
Jenkins for Gitee
</div>
</a></div>
</div>
</div>
<div class='item'>
<div class='ui pointing top right dropdown git-project-service'>
<div class='text'>
<i class='iconfont icon-service'></i>
服务
</div>
<i class='dropdown icon'></i>
<div class='menu' style='display:none'>
<a class="item" href="/mtons/mblog/pages"><img alt="Logo en" src="/static/images/logo-en.svg" />
<div class='item-title'>
Gitee Pages
</div>
</a><a class="item" href="/mtons/mblog/javadoc"><img alt="Maven" src="https://assets.gitee.com/assets/maven-bd58aee84f266d64d4b8ce5b006a9fcf.png" />
<div class='item-title'>
JavaDoc
</div>
</a><a class="item" href="/mtons/mblog/quality_analyses?platform=sonar_qube"><img alt="Sonar mini" src="https://assets.gitee.com/assets/sonar_mini-5e1b54bb9f6c951d97fb778ef623afea.png" />
<div class='item-title'>
质量分析
</div>
</a><a class="item" href="/mtons/mblog/quality_analyses?platform=codesafe"><img alt="Codesafe mini" src="https://assets.gitee.com/assets/codesafe_mini-accbe1e555e9864c552620240d10e4de.png" width="100%" />
<div class='item-title'>
奇安信代码卫士
</div>
</a><a class="item" href="/mtons/mblog/gitee_scans"><img alt="Giteescan" src="https://assets.gitee.com/assets/giteescan-cd9ab4076bd751faf7e30888eb10f782.png" />
<div class='item-title'>Gitee Scan</div>
</a><button class='ui orange basic button quit-button' id='quiting-button'>
我知道了，不再自动展开
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
  $('.git-project-nav .ui.dropdown').dropdown({ action: 'nothing' });
</script>
<style>
  .git-project-nav i.checkmark.icon {
    color: green;
  }
  #quiting-button {
    display: none;
  }
  
  .git-project-nav .dropdown .menu.hidden:after {
    visibility: hidden !important;
  }
</style>
<script>
  isSignIn = false
  isClickGuide = false
  $('#git-versions.dropdown').dropdown();
  $.ajax({
    url:"/mtons/mblog/access/add_access_log",
    type:"GET"
  });
  $('#quiting-button').on('click',function() {
    $('.git-project-service').click();
    if (isSignIn) {
      $.post("/projects/set_service_guide")
    }
    $.cookie("Serve_State", true, { expires: 3650, path: '/'})
    $('#quiting-button').hide();
  });
  if (!(isClickGuide || $.cookie("Serve_State") == 'true')) {
    $('.git-project-service').click()
    $('#quiting-button').show()
  }
</script>

</div>
<div class='ui container'>
<div class='register-guide'>
<div class='register-container'>
<div class='regist'>
加入 Gitee
</div>
<div class='description'>
与超过 500 万 开发者一起发现、参与优秀开源项目，私有仓库也完全免费 ：）
</div>
<a class="ui orange button free-registion" href="/signup?from=project-guide" sa_evt="register_show" sa_referrer_action="免费加入" sa_referrer_type="仓库页面" sa_referrer_url="">免费加入</a>
<div class='login'>
已有帐号？
<a href="/login?from=project-guide">立即登录</a>
</div>
</div>
</div>

<div class='git-project-content-wrapper'>
<div class='ui grid' id='project-wrapper'>
<div class='twelve wide column'>
<div id='git-project-search-panel' style='display: none;'>
<a href='javascript: void(0);' id='back-to-list'>
<i class='angle left icon'></i>
返回
</a>
<div class='ui icon input search-input'>
<i class='iconfont icon-search icon'></i>
<input id='search-name' maxlength='40' placeholder='搜索文件' type='text'>
</div>
</div>
<div class='git-project-content' id='git-project-content'>
<div class='git-project-desc-wrapper'>
<script>
  if (false) {
    gon.project_new_blob_path = "/mtons/mblog/new/master"
    bindShowModal({
      el: $('.no-license .project-license__create'),
      complete: function(data, modal) {
        if (!data.haveNoChoice && !data.data) {
          Flash.show('请选择一项开源许可证')
        } else {
          location.href = gon.project_new_blob_path + '?license=' + data.data
        }
      },
      skip: function () {
        location.href = gon.project_new_blob_path + '?license'
      }
    });
  }
  
  $('i.help.circle.icon').popup({
    popup: '.no-license .ui.popup',
    position: 'right center'
  });
  
  $('#remove-no-license-message').on('click', function() {
    $.cookie("skip_repo_no_license_message_267716", 'hide', { expires: 365 });
    $('#user-no-license-message').hide();
    return;
  });
</script>
</div>

<div class='git-project-bread' id='git-project-bread'>
<div class='ui horizontal list mr-1'>
<div class='item git-project-branch-item'>
<input id="path" name="path" type="hidden" value="" />
<div class='ui top left pointing dropdown gradient button dropdown-has-tabs' id='git-project-branch'>
<input id="ref" name="ref" type="hidden" value="master" />
<div class='default text'>
master
</div>
<i class='dropdown icon'></i>
<div class='menu'>
<div class='ui left icon search input'>
<i class='iconfont icon-search'></i>
<input class='search-branch' placeholder='搜索分支' type='text'>
</div>
<div class='tab-menu'>
<div class='tab-menu-action' data-tab='branches'>
<a class="ui link button" href="/mtons/mblog/branches">管理</a>
</div>
<div class='tab-menu-action' data-tab='tags'>
<a class="ui link button" href="/mtons/mblog/tags">管理</a>
</div>
<div class='tab-menu-item' data-placeholder='搜索分支' data-tab='branches'>
分支 (4)
</div>
<div class='tab-menu-item' data-placeholder='搜索标签' data-tab='tags'>
标签 (8)
</div>
</div>
<div class='tab scrolling menu' data-tab='branches'>
<div class="item" data-value="master"><span>master</span></div>
<div class="item" data-value="dev"><span>dev</span></div>
<div class="item" data-value="feature/docker_mblog"><span>feature/docker_mblog</span></div>
<div class="item" data-value="gh-pages"><span>gh-pages</span></div>
</div>
<div class='tab scrolling menu' data-tab='tags'>
<div class='item' data-value='3.5.0'>3.5.0</div>
<div class='item' data-value='3.1.12'>3.1.12</div>
<div class='item' data-value='3.0'>3.0</div>
<div class='item' data-value='2.8'>2.8</div>
<div class='item' data-value='2.7'>2.7</div>
<div class='item' data-value='v2.6.3'>v2.6.3</div>
<div class='item' data-value='v2.6'>v2.6</div>
<div class='item' data-value='v0.2-alpha'>v0.2-alpha</div>
</div>
</div>
</div>
<style>
  .iconfont.icon-shieldlock {
    color: #8c92a4;
  }
</style>

<script>
  $(function () {
    Gitee.initTabsInDropdown($('#git-project-branch').dropdown({
      fullTextSearch: true,
      selectOnKeydown: true,
      action: function (text,value,el) {
        var oItemOrInitObject = el[0] || el
        var isNotSelect = oItemOrInitObject.dataset.tab && oItemOrInitObject.dataset.tab === 'branches'
        if(isNotSelect){
          console.warn("You didn't choose a branch")
          return
        } 
        var path = $('#path').val();
        var href = ['/mtons/mblog/tree', encodeURIComponent(value), path].join('/');
        window.location.href = href;
        return true
      },
      onNoResults: function (searchTerm) {
        //未找到结果
        return true
      },
    }));
    $('.protected-branch-popup').popup()
  })
</script>

</div>
</div>
<div class='git-project-right-actions pull-right'>
<div class='ui orange button' id='btn-dl-or-clone'>
克隆/下载
<i class='dropdown icon'></i>
</div>
<div class='git-project-download-panel for-project ui bottom right popup'>
<div class='ui small secondary pointing menu'>
<a class='item active' data-text='' data-type='http' data-url='https://gitee.com/mtons/mblog.git'>HTTPS</a>
<a class='item' data-text='' data-type='ssh' data-url='git@gitee.com:mtons/mblog.git'>SSH</a>
<a class='item' data-text="该仓库未启用SVN访问，请仓库管理员前往【&lt;a target='_blank' href=/mtons/mblog/settings&gt;仓库设置&lt;/a&gt;】开启。" data-type='svn' data-url=''>SVN</a>
<a class='item' data-text="该仓库未启用SVN访问，请仓库管理员前往【&lt;a target='_blank' href=/mtons/mblog/settings&gt;仓库设置&lt;/a&gt;】开启。" data-type='svn_ssh' data-url=''>SVN+SSH</a>
</div>
<div class='ui fluid right labeled small input download-url-panel'>
<input id="project_clone_url" name="project_clone_url" onclick="focus();select()" readonly="readonly" type="text" value="https://gitee.com/mtons/mblog.git" />
<div class='ui basic label'>
<div class='ui small basic orange button' data-clipboard-target='#project_clone_url' id='btn-copy-clone-url'>
复制
</div>
</div>
</div>
<div class='ui fluid right labeled warning-text forbid-warning-text'>

</div>
<hr>
<a class="ui fluid download link button" href="javascript:void(0);" sa_evt="loginInform_show" sa_referrer_action="克隆/下载" sa_referrer_type="仓库页面" sa_referrer_url=""><i class='icon download'></i>
下载ZIP
</a><div class='download_repository_zip form modal tiny ui' id='unlanding-complaint-modal'>
<i class='iconfont icon-close close'></i>
<div class='header'>
登录提示
</div>
<div class='container actions'>
<div class='content'>
该操作需登录 Gitee 帐号，请先登录后再操作。
</div>
<div class='ui orange icon large button ok'>
立即登录
</div>
<div class='ui button blank cancel'>
没有帐号，去注册
</div>
</div>
</div>
<script>
  var $elm = $('.download');
  
  $elm.on('click', function() {
    var modals = $("#unlanding-complaint-modal.download_repository_zip");
    if (modals.length > 1) {
      modals.eq(0).modal('show');
    } else {
      modals.modal('show');
    }
  })
  $("#unlanding-complaint-modal.download_repository_zip").modal({
    onDeny: function() {
      window.location.href = "/signup?from=download_repository_zip";
    },
    onApprove: function() {
      window.location.href = "/login?from=download_repository_zip";
    }
  })
</script>

</div>
<script>
  (function() {
    var $btnClone, $btnCopy, $input, $panel;
  
    $btnClone = $('#btn-dl-or-clone');
  
    $panel = $('.git-project-download-panel');
  
    $input = $('#project_clone_url');
  
    $btnCopy = $('#btn-copy-clone-url');
  
    $btnClone.popup({
      on: 'click',
      hoverable: true,
      position: 'bottom center'
    });
  
    $panel.find('.menu > .item').on('click', function(e) {
      var $item, dataUrl;
      $item = $(this).addClass('active');
      $item.siblings().removeClass('active');
      dataUrl = $item.attr('data-url');
      if (dataUrl) {
        $panel.find('.download-url-panel').show();
        $input.val(dataUrl);
        $panel.find('.forbid-warning-text').html('');
      } else {
        $panel.find('.download-url-panel').hide();
        $panel.find('.forbid-warning-text').html($item.attr('data-text') || '');
      }
      return $.cookie('remote_way', $item.attr('data-type'), {
        expires: 365,
        path: '/'
      });
    }).filter('[data-type="http"]').trigger('click');
  
    new Clipboard($btnCopy[0]).on('success', function() {
      $btnCopy.popup({
        content: '已复制',
        position: 'right center',
        onHidden: function() {
          return $btnCopy.popup('destroy');
        }
      });
      return $btnCopy.popup('show');
    });
  
  }).call(this);
</script>

</div>
<div class='d-inline pull-right' id='git-project-root-actions'>
<div class='ui horizontal list repo-action-list'>
<div class='item'>
<div class='ui pointing right top dropdown gradient button' id='git-project-file'>
<div class='text'>文件</div>
<i class='dropdown icon'></i>
<div class='menu'>
<a class="item repo-action" href="/mtons/mblog/new/master" id="new_file_bread" title="新建文件">新建文件
</a><div class='disabled item'>上传文件</div>
<a class='item repo-action' id='search-files'>
搜索文件
</a>
</div>
</div>
</div>
<div class='item toschina-content__hidden'>
<a class="ui gradient button webide" href="/-/ide/project/mtons/mblog/edit/master/-/" target="_blank">Web IDE</a>
</div>
</div>
<script>
  $('#git-project-file').dropdown({ action: 'hide' });
</script>

</div>
<div class='breadcrumb_path path-breadcrumb-contrainer' id='git-project-breadcrumb'>

</div>
<div class='ui horizontal list repo-action-list' style=''>
<div class='item'>
<a class="ui blank button" href="/mtons/mblog/branches"><i class='iconfont icon-branches'></i>
分支 4
</a></div>
<div class='item mr-3'>
<a class="ui blank button" href="/mtons/mblog/tags"><i class='iconfont icon-tag'></i>
标签 8
</a></div>
</div>
</div>

<style>
  .ui.dropdown .menu > .header {
    text-transform: none; }
</style>
<script>
  $(function () {
    var $tip = $('#apk-download-tip');
    if (!$tip.length) {
      return;
    }
    $tip.find('.btn-close').on('click', function () {
      $tip.hide();
    });
  });
  (function(){
    function pathAutoRender() {
      var $parent = $('#git-project-bread'),
          $child = $('#git-project-bread').children('.ui.horizontal.list'),
          mainWidth = 0;
      $child.each(function (i,item) {
        mainWidth += $(item).width()
      });
      $('.breadcrumb.path.fork-path').remove();
      if (mainWidth > 995) {
        $('#path-breadcrumb').hide();
        $parent.append('<div class="ui breadcrumb path fork-path">' + $('#path-breadcrumb').html() + '<div/>')
      } else {
        $('#path-breadcrumb').show();
      }
    }
    window.pathAutoRender = pathAutoRender;
    pathAutoRender();
  })();
</script>

<div class='row column tree-holder' id='tree-holder'>
<div class='tree-content-holder' data-build-state='' id='tree-content-holder'>
<div class='ui flat nopadding segment tree-content'>
<div class='git-project-recent-commit' id='git-project-info'>
<div class='recent-commit'>
<a class="commit-author-link  js-popover-card" data-username="null" href="mailto:xulang12345"><img alt="" avatar="xulang-" class="mini avatar circular ui image 20" width="20" /> <span class="commit-author-name">xulang</span></a>
<a class="repo-index-commit-msg" href="/mtons/mblog/commit/469ea43b7d9002d09deca0f7cc8128394f09bfb5" title="更新readme">更新readme</a>
<span>469ea43</span>
<span class='timeago' datetime='2020-11-26 14:37' title='2020-11-26 14:37:08 +0800'></span>
<span class='iconfont fs-12 hidden' id='recent-build-state'></span>
</div>
<div class='all-commits'>
<a href="/mtons/mblog/commits/master"><i class='iconfont icon-commit'></i>
468 次提交
</a></div>
</div>
<script>
  var $treeContentHolder = $('#tree-content-holder');
  var $recentBuildState = $('#recent-build-state');
  if ($treeContentHolder.length && $recentBuildState.length) {
    var buildState = $treeContentHolder.data('build-state');
    if (buildState) {
      $recentBuildState.removeClass('hidden').addClass('icon-ci-' + buildState);
    }
  }
</script>

<div class='grid list selection table_da39a3ee5e6b4b0d3255bfef95601890afd80709 tree-table ui' id='tree-slider'>
<div class='create-folder-form form ui'>
<form accept-charset="UTF-8" action="/mtons/mblog/new/master" id="folder_form-edit" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="L4uP5ye1IV9lzqssNsW6DpxBmBq9gtAvav9QZANRx1Q=" /></div>
<div class='fields'>
<div class='field'>
<input id="new_file_path" name="new_file_path" type="hidden" />
<input id="content" name="content" type="hidden" />
<input id='new_folder_path' name='new_folder_path' placeholder='新建文件夹' type='text'>
</div>
<div class='field'>
<button class="ui primary button orange submit field-init-btn js-submit-btn" name="button" type="submit">提交</button>
<a class="ui basic white button cancel field-init-btn" href="javascript:void(0)">取消</a>
</div>
<div class='ui mid-center small message notice'>
<strong>提示:</strong>
由于 Git 不支持空文件夾，创建文件夹后会生成空的 .keep 文件
</div>
</div>
</form>

</div>
<div class='file_71ab8b6afb1bae3df247e0286da35e0da16564ff row tree-item' data-branch='master' data-type='folder' file_hex='file_71ab8b6afb1bae3df247e0286da35e0da16564ff'>
<div class='five wide column tree-item-file-name tree-folder tree-list-item' data-path='docs' data-type='folder'>
<i class='iconfont icon-folders'></i>
<a href="/mtons/mblog/tree/master/docs" title="docs"><span class='simplified-path'></span>docs
</a></div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_71ab8b6afb1bae3df247e0286da35e0da16564ff row tree-item tree-item-rename' file_hex='file_71ab8b6afb1bae3df247e0286da35e0da16564ff' style='display:none'>
<div class='ui column form' path='tree/master/docs'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='docs'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9 row tree-item' data-branch='master' data-type='folder' file_hex='file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9'>
<div class='five wide column tree-item-file-name tree-folder tree-list-item' data-path='src' data-type='folder'>
<i class='iconfont icon-folders'></i>
<a href="/mtons/mblog/tree/master/src" title="src"><span class='simplified-path'></span>src
</a></div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9 row tree-item tree-item-rename' file_hex='file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9' style='display:none'>
<div class='ui column form' path='tree/master/src'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='src'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_a5cc2925ca8258af241be7e5b0381edf30266302 row tree-item' data-branch='master' data-type='file' file_hex='file_a5cc2925ca8258af241be7e5b0381edf30266302'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='.gitignore' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/.gitignore" title=".gitignore">.gitignore</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_a5cc2925ca8258af241be7e5b0381edf30266302 row tree-item tree-item-rename' file_hex='file_a5cc2925ca8258af241be7e5b0381edf30266302' style='display:none'>
<div class='ui column form' path='blob/master/.gitignore'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='.gitignore'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4 row tree-item' data-branch='master' data-type='file' file_hex='file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='Dockerfile' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/Dockerfile" title="Dockerfile">Dockerfile</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4 row tree-item tree-item-rename' file_hex='file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4' style='display:none'>
<div class='ui column form' path='blob/master/Dockerfile'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='Dockerfile'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_0398ccd0f49298b10a3d76a47800d2ebecd49859 row tree-item' data-branch='master' data-type='file' file_hex='file_0398ccd0f49298b10a3d76a47800d2ebecd49859'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='LICENSE' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/LICENSE" title="LICENSE">LICENSE</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_0398ccd0f49298b10a3d76a47800d2ebecd49859 row tree-item tree-item-rename' file_hex='file_0398ccd0f49298b10a3d76a47800d2ebecd49859' style='display:none'>
<div class='ui column form' path='blob/master/LICENSE'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='LICENSE'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d row tree-item' data-branch='master' data-type='file' file_hex='file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='README.md' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/README.md" title="README.md">README.md</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d row tree-item tree-item-rename' file_hex='file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d' style='display:none'>
<div class='ui column form' path='blob/master/README.md'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='README.md'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_59f81c123b3abbcb97274545796dd18706c3e106 row tree-item' data-branch='master' data-type='file' file_hex='file_59f81c123b3abbcb97274545796dd18706c3e106'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='build.sh' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/build.sh" title="build.sh">build.sh</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_59f81c123b3abbcb97274545796dd18706c3e106 row tree-item tree-item-rename' file_hex='file_59f81c123b3abbcb97274545796dd18706c3e106' style='display:none'>
<div class='ui column form' path='blob/master/build.sh'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='build.sh'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_fbd16a49c307f18f957a16c32f87f799d1b7717f row tree-item' data-branch='master' data-type='file' file_hex='file_fbd16a49c307f18f957a16c32f87f799d1b7717f'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='change.log' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/change.log" title="change.log">change.log</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_fbd16a49c307f18f957a16c32f87f799d1b7717f row tree-item tree-item-rename' file_hex='file_fbd16a49c307f18f957a16c32f87f799d1b7717f' style='display:none'>
<div class='ui column form' path='blob/master/change.log'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='change.log'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_35b8c13cf2eb2a194eada000eb310d65aed53b2a row tree-item' data-branch='master' data-type='file' file_hex='file_35b8c13cf2eb2a194eada000eb310d65aed53b2a'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='docker-compose.yml' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/docker-compose.yml" title="docker-compose.yml">docker-compose.yml</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_35b8c13cf2eb2a194eada000eb310d65aed53b2a row tree-item tree-item-rename' file_hex='file_35b8c13cf2eb2a194eada000eb310d65aed53b2a' style='display:none'>
<div class='ui column form' path='blob/master/docker-compose.yml'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='docker-compose.yml'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_442292b8a7efeabbe4cc176709b833b1792140ec row tree-item' data-branch='master' data-type='file' file_hex='file_442292b8a7efeabbe4cc176709b833b1792140ec'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='pom.xml' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/pom.xml" title="pom.xml">pom.xml</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_442292b8a7efeabbe4cc176709b833b1792140ec row tree-item tree-item-rename' file_hex='file_442292b8a7efeabbe4cc176709b833b1792140ec' style='display:none'>
<div class='ui column form' path='blob/master/pom.xml'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='pom.xml'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>
<div class='file_324fcb49f1cf313ebdd7cbda6a71b73727ddd94d row tree-item' data-branch='master' data-type='file' file_hex='file_324fcb49f1cf313ebdd7cbda6a71b73727ddd94d'>
<div class='five wide column tree-item-file-name tree-list-item' data-path='run.sh' data-type='file'>
<i class="iconfont icon-file"></i>
<a href="/mtons/mblog/blob/master/run.sh" title="run.sh">run.sh</a>
</div>
<div class='js-tree-row-commit'></div>
</div>
<div class='rename-file_324fcb49f1cf313ebdd7cbda6a71b73727ddd94d row tree-item tree-item-rename' file_hex='file_324fcb49f1cf313ebdd7cbda6a71b73727ddd94d' style='display:none'>
<div class='ui column form' path='blob/master/run.sh'>
<div class='two fields'>
<div class='five wide field'>
<input class='ui input' name='new_filename' type='text' value='run.sh'>
</div>
<div class='five wide field'>
<button class='ui blue button popup-save' type='submit'>保存</button>
<button class='ui basic button popup-close'>取消</button>
</div>
</div>
</div>
</div>

</div>

</div>
<div class='ui tree_progress' data-logs-path='/mtons/mblog/refs/master/logs_tree/'>
<div class='ui active inverted dimmer'>
<div class='ui small text loader'>Loading...</div>
</div>
</div>
<div class='readme-box' id='git-readme'>
<div class='ui flat nopadding segment file_holder'>
<div class='file_title'>
<i class='iconfont icon-readme'></i>
<span class='file_name'>
README.md
</span>
</div>
<div class='file_catalog'>
<div class='toggle'>
<i class='icon angle left'></i>
</div>
<div class='scroll-container'>
<div class='container'>
<div class='skeleton'>
<div class='line line1'></div>
<div class='line line2'></div>
<div class='line line3'></div>
<div class='line line1'></div>
<div class='line line2'></div>
<div class='line line3'></div>
</div>
</div>
</div>
</div>
<div class='file_content markdown-body'>
<h3>&#x000A;<a id="mblog-开源java博客系统-支持多用户-支持切换主题" class="anchor" href="#mblog-%E5%BC%80%E6%BA%90java%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F-%E6%94%AF%E6%8C%81%E5%A4%9A%E7%94%A8%E6%88%B7-%E6%94%AF%E6%8C%81%E5%88%87%E6%8D%A2%E4%B8%BB%E9%A2%98"></a>Mblog 开源Java博客系统, 支持多用户, 支持切换主题</h3>&#x000A;<p><a href="http://mtons.com" rel="nofollow"><img src="https://img.shields.io/badge/author-landy-green.svg?style=flat-square" alt="Author"></a>&#x000A;<a href="#"><img src="https://img.shields.io/badge/jdk-1.8-green.svg?style=flat-square" alt="JDK"></a>&#x000A;<a href="https://github.com/langhsu/mblog" rel="nofollow"><img src="https://img.shields.io/github/release/langhsu/mblog.svg?style=flat-square" alt="Release"></a>&#x000A;<a href="https://github.com/langhsu/mblog/blob/master/LICENSE" rel="nofollow"><img src="https://img.shields.io/badge/license-GPL--3.0-green.svg" alt="license"></a>&#x000A;<a href="https://hub.docker.com/r/langhsu/mblog" rel="nofollow"><img src="https://img.shields.io/docker/automated/langhsu/mblog.svg?style=flat-square" alt="Docker"></a>&#x000A;<a href="https://jq.qq.com/?_wv=1027&amp;k=521CRdF" rel="nofollow"><img src="https://img.shields.io/badge/chat-Mtons-green.svg" alt="QQ群"></a></p>&#x000A;<h3>&#x000A;<a id="技术选型" class="anchor" href="#%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B"></a>技术选型：</h3>&#x000A;<ul>&#x000A;<li>JDK8</li>&#x000A;<li>MySQL</li>&#x000A;<li>Spring-boot</li>&#x000A;<li>Spring-data-jpa</li>&#x000A;<li>Shiro</li>&#x000A;<li>Lombok</li>&#x000A;<li>Freemarker</li>&#x000A;<li>Bootstrap</li>&#x000A;<li>SeaJs</li>&#x000A;</ul>&#x000A;<h3>&#x000A;<a id="启动" class="anchor" href="#%E5%90%AF%E5%8A%A8"></a>启动：</h3>&#x000A;<ul>&#x000A;<li>main方法运行</li>&#x000A;</ul>&#x000A;<div class="white"><div class="highlight"><pre><span id="LC1" class="line">配置：src/main/resources/application-mysql.yml (数据库账号密码)、新建db_mblog的数据库</span>&#x000A;<span id="LC2" class="line">运行：src/main/java/com/mtons/mblog/BootApplication</span>&#x000A;<span id="LC3" class="line">访问：http://localhost:8080/</span>&#x000A;<span id="LC4" class="line">后台：http://localhost:8080/admin</span>&#x000A;<span id="LC5" class="line">账号：默认管理员账号为 admin/12345</span>&#x000A;<span id="LC6" class="line"></span>&#x000A;<span id="LC7" class="line">TIPS: </span>&#x000A;<span id="LC8" class="line">如遇到启动失败/切换环境变量后启动失败的,请先maven clean后再尝试启动</span>&#x000A;<span id="LC9" class="line">IDE得装lombok插件</span></pre></div></div>&#x000A;<ul>&#x000A;<li>文档: <a href="https://langhsu.github.io/mblog/#/" rel="nofollow">说明文档</a>&#x000A;</li>&#x000A;<li>官网: <a href="http://www.mtons.com" rel="nofollow">官网地址</a>&#x000A;</li>&#x000A;<li>QQ交流群：378433412</li>&#x000A;</ul>&#x000A;<h3>&#x000A;<a id="版本40更新内容" class="anchor" href="#%E7%89%88%E6%9C%AC40%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9"></a>版本(4.0)更新内容：</h3>&#x000A;<div class="white"><div class="highlight"><pre><span id="LC1" class="line">1. 新增 &lt;@layout.extends name="xxx"&gt;&lt;/layout.extends&gt; 标签, 用于进入模板文件, 解决主题开发时各种路径带入主题名的问题</span>&#x000A;<span id="LC2" class="line">2. 新增 &lt;@layout.block name="header"&gt;&lt;/layout.block&gt; 标签, 用于模板的占位, 可配合`layout.put`替换指定block区域内容,</span>&#x000A;<span id="LC3" class="line">3. 新增 &lt;@layout.put block="contents" type="APPEND"&gt;&lt;/layout.put&gt; 标签, 用户替换模板内容块, 丢弃freemarker变量传递, 增强主题可维护性</span>&#x000A;<span id="LC4" class="line">4. `layout.put`中的type 支持替换类型: APPEND, PREPEND, REPLACE</span>&#x000A;<span id="LC5" class="line">5. 调整`default`, `classic`主题, 使用新的主题开发方式</span>&#x000A;<span id="LC6" class="line">6. `建议MySQL版本5.7`</span></pre></div></div>&#x000A;<h3>&#x000A;<a id="版本35更新内容" class="anchor" href="#%E7%89%88%E6%9C%AC35%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9"></a>版本(3.5)更新内容：</h3>&#x000A;<div class="white"><div class="highlight"><pre><span id="LC1" class="line">1. 文件存储目录可配置, 见 site.location, 默认为 user.dir</span>&#x000A;<span id="LC2" class="line">2. 支持在${site.location}/storage/templates 目录下扩展自己的主题(${site.location}具体位置见启动日志)</span>&#x000A;<span id="LC3" class="line">3. 后台未配置对应第三方登录信息时, 前端不显示对应的按钮</span>&#x000A;<span id="LC4" class="line">4. 模板优化</span>&#x000A;<span id="LC5" class="line">5. 后台配置主题改为自动从目录中加载</span>&#x000A;<span id="LC6" class="line">6. 新增markdown编辑器, 可在后台选择tinymce/markdown</span></pre></div></div>&#x000A;<h3>&#x000A;<a id="版本30更新内容" class="anchor" href="#%E7%89%88%E6%9C%AC30%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9"></a>版本(3.0)更新内容：</h3>&#x000A;<div class="white"><div class="highlight"><pre><span id="LC1" class="line">1. 新增开关控制(注册开关, 发文开关, 评论开发)</span>&#x000A;<span id="LC2" class="line">2. 后台重写, 替换了所有后台页面功能更完善</span>&#x000A;<span id="LC3" class="line">3. 上传图片添加更多支持(本地/又拍云/阿里云/七牛云), 详情见后台系统配置</span>&#x000A;<span id="LC4" class="line">4. 升级为spring-boot2</span>&#x000A;<span id="LC5" class="line">5. 调整模板静态资源引用,方便扩展</span>&#x000A;<span id="LC6" class="line">6. 表名调整, 旧版本升级时请自行在数据库重命名, 详情见change.log</span>&#x000A;<span id="LC7" class="line">7. 重写了config(改为options), 可在applicaiton.yaml设置默认配置, 启动后将以options中配置为准</span>&#x000A;<span id="LC8" class="line">8. 支持后台设置主题</span>&#x000A;<span id="LC9" class="line">9. 去除了本地文件上传目录配置, 改为自动取项目运行目录(会在jar同级目录生成storeage和indexes目录)</span>&#x000A;<span id="LC10" class="line">10. 替换表单验证插件, 评论表情改为颜文字</span>&#x000A;<span id="LC11" class="line">11. 我的主页和Ta人主页合并</span>&#x000A;<span id="LC12" class="line">12. 优化了图片裁剪功能</span>&#x000A;<span id="LC13" class="line">13. 支持Docker, 详情见 https://hub.docker.com/r/langhsu/mblog</span>&#x000A;<span id="LC14" class="line">14. 邮件服务后台可配</span>&#x000A;<span id="LC15" class="line">15. 新增标签页</span>&#x000A;<span id="LC16" class="line">16. 新增注册邮箱验证开关(需要手动删除之前的 mto_security_code 表)</span></pre></div></div>&#x000A;<h3>&#x000A;<a id="图片演示" class="anchor" href="#%E5%9B%BE%E7%89%87%E6%BC%94%E7%A4%BA"></a>图片演示</h3>&#x000A;<p><img src="https://images.gitee.com/uploads/images/2019/0414/175116_449ed877_1758849.jpeg" alt="输入图片说明" title="1.jpg">&#x000A;<img src="https://images.gitee.com/uploads/images/2019/0414/175353_6185e4f1_1758849.jpeg" alt="输入图片说明" title="2.jpg"></p>&#x000A;<h3>&#x000A;<a id="扩展主题" class="anchor" href="#%E6%89%A9%E5%B1%95%E4%B8%BB%E9%A2%98"></a>扩展主题</h3>&#x000A;<p><a href="https://pan.baidu.com/s/1tBwtprEAuCqcqDhVBunMGA" rel="nofollow">Youth 主题传送门</a> (作者:小崔崔)(提取码: 25e9)</p>&#x000A;<ul>&#x000A;<li>感谢开发主题大佬们的无私奉献</li>&#x000A;</ul></div>
</div>
</div>
<script>
  "use strict";
  if ($('.markdown-body').children("style").length != 0) {
    var i, array = $('.markdown-body').children("style");
    array.first().attr('scoped','');
    $.scoped();
  }
  
  window.Gitee.initReadmeCatalog();
  toMathMlCode('','markdown-body')
</script>
<style>
  .txt-style {
    background: #FFF !important;
    padding: 0 !important; }
</style>

</div>
<div class='project__footer-container'>
<div class='actions'>
<div class='item star-container'>
<div class='unstar'>
<a href="/login" sa_evt="loginInform_show" sa_referrer_action="Star" sa_referrer_type="仓库页面" sa_referrer_url=""><div class='circle'>
<i class='iconfont icon-star-solid'></i>
</div>
</a><a class="content" href="/mtons/mblog/stargazers"><div class='title'>
Starred
</div>
<div class='desc action-social-count'>
2.5K
</div>
</a></div>
<div class='star'>
<a href="/login" sa_evt="loginInform_show" sa_referrer_action="Star" sa_referrer_type="仓库页面" sa_referrer_url=""><div class='circle'>
<i class='iconfont icon-star'></i>
</div>
</a><a class="content" href="/mtons/mblog/stargazers"><div class='title'>
Star
</div>
<div class='desc action-social-count'>
2.5K
</div>
</a></div>
</div>
<div class='item fork-container'>
<a href="/login" sa_evt="loginInform_show" sa_referrer_action="Fork" sa_referrer_type="仓库页面" sa_referrer_url=""><div class='circle'>
<i class='iconfont icon-fork'></i>
</div>
</a><a href="/mtons/mblog/members"><div class='content'>
<div class='title'>
Fork
</div>
<div class='desc'>
1.4K
</div>
</div>
</a></div>
<div class='item donate-container'>
<div class='circle'>
<i class='iconfont icon-donate'></i>
</div>
<div class='content'>
<div class='title'>捐赠</div>
<div class='desc'>
25 人次
</div>
</div>
<a class="donate-detail" href="javascript: void(0);">详情</a>
</div>
</div>
<div class='project-donate-list hide'>
<div class='title'>最近捐赠记录</div>
<div class='container'></div>
<a class="btn-load-more" href="javascript: void(0);">查看更多</a>
<div class='tip-loading' style='display: none'>
<div class='ui active mini inline loader'></div>
正在加载...
</div>
</div>
</div>
<script>
  var $donateModal = $('.project-donate-modal');
  $('.donate-container').on('click', '.circle, .content', function () {
    $donateModal.modal('show');
  });
</script>
<script>
  (function() {
    var $btnLoad, $donateDetail, $donateList, $list, $tipLoading, isFirstLoaded, isLoading, loadDonates, page, setDonates;
  
    page = 0;
  
    isLoading = false;
  
    isFirstLoaded = false;
  
    $donateDetail = $('.donate-detail');
  
    $donateList = $('.project-donate-list');
  
    $list = $donateList.find('.container');
  
    $btnLoad = $donateList.find('.btn-load-more');
  
    $tipLoading = $donateList.find('.tip-loading');
  
    setDonates = function(list) {
      var html, i, item, len;
      html = '<div>';
      for (i = 0, len = list.length; i < len; i++) {
        item = list[i];
        if (item.donator_avatar_url.indexOf('no_portrait.png') === 0) {
          item.donator_avatar_url = LetterAvatar(item.donator_name);
        }
        html += "<div class=\"item\">\n  <span class=\"donate-info\">\n    <img src=\"" + item.donator_avatar_url + "\" class=\"ui inline circular image\" alt=\"" + item.donator_name + "\" />\n  </span>\n  <div class=\"ui popup text-center\">\n    <div class=\"header\">\n      " + item.donator_name + "\n      <span class=\"ui mini yellow circular label\">¥ " + item.money + "</span>\n    </div>\n    <div class=\"content\">" + item.message + "</div>\n  </div>\n</div>";
      }
      html += '</div>';
      $list.append(html);
      return $list.find('.donate-info').popup({
        inline: true,
        position: 'bottom center'
      });
    };
  
    loadDonates = function() {
      if (isLoading) {
        return;
      }
      page += 1;
      isLoading = true;
      $btnLoad.hide();
      $tipLoading.show();
      return $.getJSON('/mtons/mblog/donates.json', {
        page: page
      }, function(list) {
        setDonates(list);
        isLoading = false;
        isFirstLoaded = true;
        if (page * 12 < 25) {
          $btnLoad.show();
          return $tipLoading.hide();
        } else {
          $btnLoad.remove();
          return $tipLoading.remove();
        }
      });
    };
  
    $btnLoad.on('click', loadDonates);
  
    $donateDetail.on('click', function() {
      $donateList.toggleClass('hide');
      if (!isFirstLoaded) {
        return loadDonates();
      }
    });
  
  }).call(this);
</script>

<script id='tree-item-context-menu-template' type='text/plain'>
<div class='ui menu compact vertical tree-context'>
<a class='btn-open-new-tab item tree-operation'>
<i class='file outline icon'></i>
新标签打开
</a>
<a class='btn-copy item tree-operation'>
<i class='copy icon'></i>
复制
</a>
<a class='btn-rename item tree-operation'>
<i class='edit icon'></i>
重命名
</a>
<a class='btn-delete item tree-operation'>
<i class='trash icon'></i>
删除
</a>
</div>
</script>
<script>
  $(function() {
    var $createFolderForm = $('.create-folder-form'),
        $createFolderSubmitBtn = $('.create-folder-form .js-submit-btn')
        $folderPath = $('#new_folder_path'),
        $message = $('.create-folder-form .notice'),
        folders = ["docs","src"],
        folderReg = new RegExp(/\/+/);
  
    var INDEX_BEGIN_WITH_READONLY_DIR = 0
    var gitGCModal = new GiteeModalHelper({
        approveText: "确认",
        cancelText: "取消",
        okText: "确认",
    })
    function checkFolder(folder) {
      var i, itemArr;
      if (folder == '') {
        return false;
      }
      for (i = 0; i< folders.length; i++) {
        itemArr = folders[i].split('/');
        if (itemArr[0] == folder){
          return true
        }
      }
      return false;
    }
  
    function createFolderShow () {
      $createFolderForm.show();
      $folderPath.focus();
    }
  
    $('.create-folder-form .cancel').click(function () {
      $createFolderForm.hide();
    })
  
    $folderPath.on('input', function (e) {
      if($(this).parent().hasClass('error')) {
        $message.removeClass('warn').html("<strong>提示:</strong> 由于 Git 不支持空文件夾，创建文件夹后会生成空的 .keep 文件");
        $(this).parent().removeClass('error');
      }
      $createFolderSubmitBtn.removeClass('disabled');
    })
  
    $createFolderForm.submit(function (e) {
      var value = $folderPath.val();
      if (!folderReg.test(value) && !checkFolder(value) && value) {
        $('#new_file_path').val(value + '/.keep');
      } else {
        $message.addClass('warn').html("文件夹名不为空，不含有字符（／）且不能与当前目录文件夹同名");
        $folderPath.parent().addClass('error');
        e.preventDefault();
      }
      $createFolderSubmitBtn.addClass('disabled');
    })
  
    $('#create-folder').click(createFolderShow);
    window.createFolderShow = createFolderShow;
  
    window.hasTreeContextMenu = false;
    var contextMenuTemplate = $('#tree-item-context-menu-template').html();
  
    if ("true" == "false" || "true" == "false" || "false" == "false") {
      return;
    }
  
    function createContextMenu($item, x, y) {
      if (hasTreeContextMenu) {
        $('.tree-context').remove();
        hasTreeContextMenu = false;
        return;
      }
      hasTreeContextMenu = true;
      var path = $item.parent().find('a').attr('href');
      var $menu = $(contextMenuTemplate).appendTo('body');
      let readonly = $item.attr('data-readonly') !== undefined
  
      if ($('.btn-readonly')[0]) {
        if (readonly) {
          $('.btn-readonly')[0].children[0].className = 'icon unlock'
          $('.btn-readonly')[0].lastChild.data = "取消只读"
        } else {
          $('.btn-readonly')[0].lastChild.data = "标记为只读"
        }
      }
      $menu.css({ left: x, top: y });
      $menu.find('.btn-open-new-tab').attr({
        href: path,
        target: '_blank'
      });
      window.Clipboard && new Clipboard('.btn-copy', {
        text: function () {
          return $item.find('a').text();
        }
      });
      $menu.find('.btn-rename').on('click', function(event) {
        rename($item.parent().attr('file_hex'));
      });
      $menu.find('.btn-delete').on('click', function(event) {
        removeFile($item.parent().next().find('.ui.form').attr('path').replace(/\+/g, '%20'), $item.find('a').text());
      })
      $menu.find('.btn-readonly').on('click', function(event) {
        var obj = $item.parent().next().find('.ui.form').attr('path').replace(/\+/g, '%20')
        let readonly = $item.attr('data-readonly') !== undefined
        if (readonly) {
          removeReadonlyMark(obj, $item)
        } else {
          addReadonlyMark(obj, $item)
        }
      })
      $menu.find('.btn-readonly-is-uncharged-enterprise').popup({
        content: "仅付费企业仓库可开启文件只读功能",
        className: {
          popup: 'ui popup',
        },
        position: 'bottom center'
      })
      $menu.find('.btn-readonly-is-open-svn').popup({
        content: "仓库已开启 SVN 支持，无法标记只读文件/目录",
        className: {
          popup: 'ui popup',
        },
        position: 'bottom center'
      })
    }
  
    var editing = false
  
    $(document).on('click',function(event){
      if (hasTreeContextMenu && event.button !== 2) {
        setTimeout(function () {
          $('.tree-context').remove();
          hasTreeContextMenu = false;
        }, 200);
      }
    })
  
    $('.tree-item').on('click',function(event){
      if (hasTreeContextMenu) {
        event.preventDefault();
      }
    })
  
    function isReadonly(path) {
      if (!gon.readonlyItems) {
        return false
      } else {
        let item_path = getItemPath(path, 'folder')
        return isTreeItemReadonly(item_path, gon.readonlyItems)
      }
    }
  
    function isParentsReadonly(path) {
      let self_path = path.replace(/\/$/, '')
      let parentPathArray = self_path.split('/')
      if (parentPathArray.length < 2) {
        return false
      }
      parentPathArray.pop()
      let parentPath = parentPathArray.join('/') + '/'
      return isReadonly(parentPath)
    }
  
    // 删除只读标记
    function removeReadonlyMark(path, $item) {
      var $icon = $($item.context.children[0])
      var $parent = $item.parent('.tree-item')
      var type = $parent.data('type')
      var branch = $parent.data('branch')
      var readonly_item = $item.data('path')
      if (type !== 'file') {
        readonly_item += "/"
      }
  
      var confirmString = `
      <p>所属分支: <code class="readonly-branch">${htmlSafe(branch)}</code></p>\
      <p>文件路径: <code class="readonly-path">${htmlSafe(readonly_item)}</code></p>\
      <strong>确认取消分支上这个路径的只读标记？</strong>
      `
      gitGCModal.confirm("取消只读", confirmString, () => {
        let parentsReadonly = isParentsReadonly(readonly_item)
        if (parentsReadonly) {
          return gitGCModal.alert('提示', '只读记录不存在，或父级目录为只读', () => {
            location.reload()
          })
        }
        $.ajax({
          url: "/mtons/mblog/readonly",
          type: `DELETE`,
          data: {
            branch,
            path: readonly_item,
          },
          success: function(res) {
            if (res.code !== 0) {
              gitGCModal.alert("提示", res.msg, () => {
                location.reload()
              })
            }  else {
              $parent.removeClass('readonly-item')
              if (gon.readonlyItems) {
                gon.readonlyItems.splice(gon.readonlyItems.indexOf(readonly_item), 1)
              }
              if (type === 'file') {
                $icon.removeClass('icon-file-readonly readonly-icon')
                $icon.addClass('icon-file')
              } else {
                $icon.removeClass('icon-folder-readonly readonly-icon')
                $icon.addClass('icon-folders')
              }
              $icon.popup('destroy')
              $item.removeAttr('data-readonly')
            }
          }
        })
      })
    }
  
    // 只读过滤
    function isTreeItemReadonly(path, readonlyItems) {
      let item = readonlyItems.find((item) => {
        if (item.slice(-1) === '/') {
          return path.indexOf(item) === INDEX_BEGIN_WITH_READONLY_DIR
        } else {
          return path === item
        }
      })
      return item !== undefined
    }
  
    function getItemPath(path, path_type='file') {
      return path_type === 'file' ? path : `${path}/`
    }
  
    // 启用异步只读差异化的次数
    let is_can_readonly = false
    // 异步对文件树进行只读差异化显示
    function markTree() {
      $.ajax({
        url: "/mtons/mblog/readonly",
        method: 'get',
        data: {
          "branch": "master"
        },
        success: (result) => {
          let readonlyItems = result.readonly_items
          gon.readonlyItems = readonlyItems
          $(".tree-list-item").each(function(){
            $this = $(this)
            let path = $this.attr('data-path')
            let type = $this.attr('data-type')
            let item_path = getItemPath(path, type)
            let readonly = isTreeItemReadonly(item_path, readonlyItems)
            $icon = $this.find('i')
            $parent = $this.parent('.tree-item')
            if (readonly) {
              $parent.addClass('readonly-item')
              $this.attr('data-readonly', '')
              $icon.attr('class', `iconfont icon-${type}-readonly readonly-icon`)
              $icon.attr('data-readonly', '')
              $icon.popup({
                content: "只读",
                className   : {
                  popup: 'ui popup dark',
                },
                position: 'top center'
              })
            } else {
              let className =  type === 'file' ? 'file' : 'folders'
              $this.removeAttr('data-readonly')
              $icon.attr('class', `iconfont icon-${className}`)
              $icon.removeAttr('data-readonly')
            }
          })
        }
      })
    }
  
    // 若已开启只读功能，对目录进行只读差异化标记
    if (is_can_readonly) {
      markTree()
    }
  
    // 添加只读标记
    function addReadonlyMark(path, $item) {
      var $icon = $($item.context.children[0])
      var $parent = $item.parent('.tree-item')
      var type = $parent.data('type')
      var branch = $parent.data('branch')
      var readonly_item = $item.data('path')
      if (type !== 'file') {
        readonly_item += "/"
      }
  
      var confirmString = `
      <p>所属分支: <code class="readonly-branch">${htmlSafe(branch)}</code></p>\
      <p>文件路径: <code class="readonly-path">${htmlSafe(readonly_item)}</code></p>\
      <strong>确认将分支上的这个路径标记为只读？</strong>
      `
      gitGCModal.confirm(`标记只读`, confirmString, () => {
        $.ajax({
          url: "/mtons/mblog/readonly",
          type: `POST`,
          data: {
            branch,
            path: readonly_item,
          },
          success: function(res) {
            if (res.code !== 0) {
              gitGCModal.alert("提示", res.msg, () => {
                location.reload()
              })
            } else {
              // 之前未开启只读功能
              if (!is_can_readonly) {
                is_can_readonly = true
                return markTree()
              }
              $parent.addClass('readonly-item')
              var existReadonlyItems = gon.readonlyItems || []
              existReadonlyItems.push(readonly_item)
              gon.readonlyItems = existReadonlyItems
              $icon.popup({
                content: "只读",
                className   : {
                  popup: 'ui popup dark',
                },
                position: 'top center'
              })
              if (type === 'file') {
                $icon.removeClass('icon-file')
                $icon.addClass('icon-file-readonly readonly-icon')
              } else {
                $icon.removeClass('icon-folders')
                $icon.addClass('icon-folder-readonly readonly-icon')
              }
              $item.attr('data-readonly', '')
            }
          }
        })
      })
    }
  
    function removeFile(path, file_name) {
      var file_name = file_name || path
      var content = "确定要删除 %{name} 吗？".replace('%{name}', htmlSafe(file_name));
      gitGCModal.confirm("删除", content, () => {
        $.ajax({
          type: "DELETE",
          dataType: "JSON",
          url: "/mtons/mblog/delete/" + path,
          success: function(res) {
            if (res.status != 1) {
              var alert_message = res.message || "删除失败"
              return gitGCModal.alert("提示", alert_message)
            }
            if ($('.tree-item-file-name').length == 2) {
              window.location.href = '/' + gon.user_project;
            } else {
              window.location.href = window.location.pathname;
            }
          }
        });
      })
    }
  
    function rename(file_hex) {
      $(".row.tree-item").show();
      $(".tree-item-rename").hide();
  
      if($("."+file_hex).is(':hidden') == true) return;
  
      $("."+file_hex).hide();
      var _t = $(".rename-"+file_hex);
      src = _t.attr('src_text')
      if(src==undefined){
         newName = _t.find("[name='new_filename']").val()
        _t.attr('src_text',newName)
      }else{
        _t.find("[name='new_filename']").val(_t.attr('src_text'))
      }
      $(".rename-"+file_hex).css("display","");
    }
  
    setTimeout(function(){
      $(".popup-save").click(function(){
        form = $(this).parents(".ui.form")
        file_hex = $(this).parents(".row.tree-item").attr("file_hex");
        new_filename = $.trim(form.find("[name='new_filename']").val())
        overwrite = false
        $('.tree-item-file-name').find('a').each(function(a){
          title = $(this).attr('title');
          if(title != undefined){
            if (title.split('/')[0].toLowerCase() == new_filename.toLowerCase()){
              overwrite = true;
            }
          }
        });
        if(overwrite){
          form.find("[name='new_filename']").focus();
          gitGCModal.alert("提示", "存在相同的文件名,请修改后重试")
          return;
        }
        $.ajax({
          type: 'POST',
          url: "/mtons/mblog/rename/"+ form.attr('path').replace(/\+/g, '%20'),
          data:
          {
            new_filename: new_filename
          },
          success: function(o){
            if(o.status == 1){
              href = window.location.href.split('?')[0]
              window.location.href = href;
            }else {
              var alert_message = o.message || "重命名失败"
              gitGCModal.alert("提示", alert_message)
            }
          },
          dataType: "json"
        });
      })
  
      $(".popup-close").click(function(){
        $(".row.tree-item").show();
        $(".tree-item-rename").hide();
      })
      $('.tree-item-file-name').each(function(){
        var $this = $(this);
        if (typeof $this.parent().attr('file_hex') === 'undefined') {
          return;
        }
        $this.contextmenu(function(event) {
          event.preventDefault();
          createContextMenu($this, event.pageX, event.pageY);
        })
      })
    },1000)
  })
</script>
<style>
  .readonly-item {
    background-color: #FBFBFB !important;
  }
  .readonly-path,.readonly-branch {
    display: block;
    white-space: normal;
    word-break: break-word;
    line-height: 1.8;
    margin-top: 1em;
  }
  .btn-readonly-is-uncharged-enterprise, .btn-readonly-is-open-svn {
    background-color: #f5f5f5 !important;
    color: #757575 !important;
  }
</style>

<div class='row column inner-comment' id='blob-comment'>
<input id="comment_path" name="comment_path" type="hidden" value="" />
<div class='tree-comments'>
<h3 id='tree_comm_title'>
点评
(
<span class='comments-count'>
552
</span>
)
</h3>
<div class='ui threaded comments middle aligned' id='notes-list'></div>
<input id="ajax_add_note_id" name="ajax_add_note_id" type="hidden" />
<div class='text-center'>
<div class='ui link button btn-load-more'>
加载更多
<i class='dorpdown icon'></i>
</div>
<div class='tip-loading' style='display: none'>
<div class='ui active mini inline loader'></div>
正在加载...
</div>
</div>
</div>
<script>
  "use strict";
  $(function(){
    var page = 1
    var commentsCount = 552
    var $container = $('.tree-comments')
    var $comments = $container.find('.ui.comments')
    var $tipLoading = $container.find('.tip-loading')
    var $btnLoad = $container.find('.btn-load-more')
    var noteAnchor = new Gitee.NoteAnchor({ defaultAnchor: '#tree_comm_title' })
  
    if (commentsCount < 1) {
      return;
    }
  
    var path;
    if ($('#comment_path').val() === '') {
      path = '/';
    } else {
      path = $('#comment_path').val();
    }
  
    function loadComments () {
      $btnLoad.hide();
      $tipLoading.show();
      $.ajax({
        url: '/mtons/mblog/comment_list',
        data: {
          page: page,
          path: path
        },
        success: function(data) {
          var err;
          try {
            $tipLoading.hide();
            $btnLoad.show();
            if (data.status !== 0) {
              $btnLoad.text('无更多评论')
              return $btnLoad.prop('disabled', true).addClass('disabled');
            } else {
              TreeComment.CommentListHandler(data);
              page += 1;
              if (data.comments_count < 10) {
                $('#ajax_add_note_id').val('');
                $btnLoad.text('无更多评论')
                $btnLoad.prop('disabled', true).addClass('disabled');
              }
              // osctree can not load script
              $comments.find('.timeago').timeago();
              $comments.find('.commenter-role-label').popup();
              noteAnchor.locate();
              toMathMlCode('', 'comments');
              return $('.markdown-body pre code').each(function(i, block) {
                return hljs.highlightBlock(block);
              });
            }
          } catch (error) {
            err = error;
            return console.log('loadComments error:' + err);
          }
        }
      });
    };
  
  
    function checkLoad () {
      var listTop, top;
      top = $(window).scrollTop();
      listTop = $container.offset().top;
      if (listTop >= top && listTop < top + $(window).height()) {
        $(window).off('scroll', checkLoad);
        return loadComments();
      }
    };
  
    $btnLoad.on('click', loadComments);
    loadComments()
  })
</script>

</div>
<div class='inner-comment-box' id='comment-box'>
<p>
你可以在<a href="/login">登录</a>后，发表评论
</p>

</div>

<div class='complaint'>
<div class='ui modal small form' id='landing-comments-complaint-modal'>
<i class='iconfont icon-close close'></i>
<div class='header'>
举报
</div>
<div class='content'>
<div class='appeal-success-tip hide'>
<i class='iconfont icon-ic_msg_success'></i>
<div class='appeal-success-text'>
举报成功
</div>
<span>
我们将于2个工作日内通过站内信反馈结果给你！
</span>
</div>
<div class='appeal-tip'>
请认真填写举报原因，尽可能描述详细。
</div>
<div class='ui form appeal-form'>
<div class='inline field'>
<label class='left-part appeal-type-wrap'>
举报类型
</label>
<div class='ui dropdown selection' id='appeal-comments-types'>
<div class='text default'>
请选择举报类型
</div>
<i class='dropdown icon'></i>
<div class='menu'></div>
</div>
</div>
<div class='inline field'>
<label class='left-part'>
举报原因
</label>
<textarea class='appeal-reason' id='appeal-comment-reason' name='msg' placeholder='请说明举报原因' rows='3'></textarea>
</div>
<div class='ui message callback-msg hide'></div>
<div class='ui small error text message exceeded-size-tip'></div>
</div>
</div>
<div class='actions'>
<div class='ui button blank cancel'>
取消
</div>
<div class='ui orange icon button disabled ok' id='complaint-comment-confirm'>
发送
</div>
</div>
</div>
<script>
  var $complaintCommentsModal = $('#landing-comments-complaint-modal'),
      $complainCommentType = $complaintCommentsModal.find('#appeal-comments-types'),
      $complaintModalTip = $complaintCommentsModal.find('.callback-msg'),
      $complaintCommentsContent = $complaintCommentsModal.find('.appeal-reason'),
      $complaintCommentBtn = $complaintCommentsModal.find('#complaint-comment-confirm'),
      complaintSending = false,
      initedCommentsType = false;
  
  function initCommentsTypeList() {
    if (!initedCommentsType) {
      $.ajax({
        url: "/appeals/fetch_types",
        method: 'get',
        data: {'type': 'comment'},
        success: function (data) {
          var result = '';
          for (var i = 0; i < data.length; i++) {
            result = result + "<div class='item' data-value='" + data[i].id + "'>" + data[i].name + "</div>";
          }
          $complainCommentType.find('.menu').html(result);
        }
      });
      $complainCommentType.dropdown({showOnFocus: false});
      initedCommentsType = true;
    }
  }
  $complainCommentType.on('click', function() {
    $complaintCommentsModal.modal({
      autofocus: false,
      onApprove: function() {
        return false;
      },
      onHidden: function() {
        restoreCommonentDefault();
      }
    }).modal('show');
  });
  
  $complaintCommentsContent.on('change keyup', function(e) {
    var content = $(this).val();
    if ($.trim(content).length > 0 && $complainCommentType.dropdown('get value').length > 0 ) {
      $complaintCommentBtn.removeClass('disabled');
      return;
    }
    $complaintCommentBtn.addClass('disabled');
  });
  
  
  $complainCommentType.dropdown({
    showOnFocus: false,
    onChange: function(value, text, $selectedItem) {
      if (value.length > 0 && $.trim($complaintCommentsContent.val()).length > 0) {
        $complaintCommentBtn.removeClass('disabled');
        return
      }
      $complaintCommentBtn.addClass('disabled');
    }
  });
  
  function restoreCommonentDefault() {
    $complainCommentType.dropdown('restore defaults');
    $complaintCommentsContent.val('');
    $('.exceeded-size-tip').text('').hide();
    $complaintModalTip.text('').hide();
    setTimeout(function() {
      setCommentSendTip(false);
    }, 1500);
  }
  
  $complaintCommentBtn.on('click',function(e){
    var reason = $complaintCommentsContent.val();
    var appealableId = $('#landing-comments-complaint-modal').attr('data-id');
    if (complaintSending) {
      return;
    }
    var appealType = $complainCommentType.dropdown('get value');
    var formData = new FormData();
    formData.append('appeal_type_id', appealType);
    formData.append('reason', reason);
    formData.append('appeal_type','Note');
    formData.append('target_id',appealableId);
    $.ajax({
      type: 'POST',
      url: "/appeals",
      cache: false,
      contentType: false,
      processData: false,
      data: formData,
      beforeSend: function() {
        setCommentSendStatus(true);
      },
      success: function(res) {
        if (res.status == 200) {
          setCommentSendTip(true);
          setTimeout(function() {
            $complaintCommentsModal.modal('hide');
            restoreCommonentDefault();
          }, 3000);
        }
        setCommentSendStatus(false);
      },
      error: function(err) {
        showCommonTips(err.responseJSON.message, 'error');
        setCommentSendStatus(false);
      }
    })
  });
  
  function showCommonTips(text, type) {
    $complaintModalTip.text(text).show();
    if (type == 'error') {
      $complaintModalTip.removeClass('success').addClass('error');
    } else {
      $complaintModalTip.removeClass('error').addClass('success');
    }
  }
  
  function setCommentSendStatus(value) {
    complaintSending = value;
    if (complaintSending) {
      $complaintCommentBtn.addClass('loading');
      $complaintCommentsContent.attr('readonly', true);
      $complainCommentType.attr('readonly', true);
    } else {
      $complaintCommentBtn.removeClass('loading');
      $complaintCommentsContent.attr('readonly', false);
      $complainCommentType.attr('readonly', false);
    }
  }
  
  function setCommentSendTip(value) {
    if (value) {
      $('.appeal-success-tip').removeClass('hide');
      $('.appeal-tip').addClass('hide');
      $('.appeal-form').addClass('hide');
      $('#landing-comments-complaint-modal .actions').addClass('hide');
    } else {
      $('.appeal-success-tip').addClass('hide');
      $('.appeal-tip').removeClass('hide');
      $('.appeal-form').removeClass('hide');
      $('#landing-comments-complaint-modal .actions').removeClass('hide');
    }
  }
</script>

</div>
<script>
  "use strict";
  $('.js-check-star').checkbox('set unchecked')
</script>

</div>
<script>
  (function() {
    $(function() {
      Tree.init();
      return TreeCommentActions.init();
    });
  
  }).call(this);
</script>
</div>
</div>
<div class='four wide column' style=''>
<div class='project__right-side'>
<div class='side-item intro'>
<div class='header'>
<h4>简介</h4>
</div>
<div class='content intro-info'>
<span class='git-project-desc-text'>mblog开源免费的博客系统, Java语言开发, 支持mysql/h2数据库, 采用spring-boot、jpa、shiro、bootstrap等流行框架开发</span>
<a class='hide spread' href='javascript:void(0);'>
展开
<i class='caret down icon'></i>
</a>
<a class='retract hide' href='javascript:void(0);'>
收起
<i class='caret up icon'></i>
</a>
<div class='intro-list'>
<div class='item'>
<i class='iconfont icon-link'></i>
<span class='git-project-homepage'>
<a href="http://mtons.com/" id="homepage" rel="nofollow" target="_blank">http://mtons.com/</a>
</span>
</div>
<div class='item'>
<i class='iconfont icon-tag-program'></i>
<span class='summary-languages'>
Java
<span class='text-muted'>
等 6 种语言
<i class='icon dropdown'></i>
</span>
</span>
<div class='ui popup summary-languages-popup'>
<div class='row'>
<div class='lang'>
<a href="/explore/all?lang=Java">Java</a>
</div>
<div class='lang-bar'>
<div class='bar' style='width: 63.4%;'></div>
</div>
<a class="percentage" href="/explore/all?lang=Java">63.4%</a>
</div>
<div class='row'>
<div class='lang'>
<a href="/explore/all?lang=FreeMarker">FreeMarker</a>
</div>
<div class='lang-bar'>
<div class='bar' style='width: 33.8%;'></div>
</div>
<a class="percentage" href="/explore/all?lang=FreeMarker">33.8%</a>
</div>
<div class='row'>
<div class='lang'>
<a href="/explore/all?lang=TSQL">TSQL</a>
</div>
<div class='lang-bar'>
<div class='bar' style='width: 1.4%;'></div>
</div>
<a class="percentage" href="/explore/all?lang=TSQL">1.4%</a>
</div>
<div class='row'>
<div class='lang'>
<a href="/explore/all?lang=HTML">HTML</a>
</div>
<div class='lang-bar'>
<div class='bar' style='width: 1.1%;'></div>
</div>
<a class="percentage" href="/explore/all?lang=HTML">1.1%</a>
</div>
<div class='row'>
<div class='lang'>
<a href="/explore/all?lang=Shell">Shell</a>
</div>
<div class='lang-bar'>
<div class='bar' style='width: 0.2%;'></div>
</div>
<a class="percentage" href="/explore/all?lang=Shell">0.2%</a>
</div>
<div class='row'>
<div class='lang'>
<a href="/explore/all?lang=Other">Other</a>
</div>
<div class='lang-bar'>
<div class='bar' style='width: 0.1%;'></div>
</div>
<a class="percentage" href="/explore/all?lang=Other">0.1%</a>
</div>
</div>
</div>

<div class='item'>
<i class='iconfont icon-licence'></i>
<a href="/mtons/mblog/blob/master/LICENSE" id="license-popup" target="_blank">GPL-3.0</a>
<div class='ui popup dark'>使用 GPL-3.0 开源许可协议</div>
</div>
</div>
</div>
<div class='content intro-form'>
<div class='ui small input'>
<textarea name='project[description]' placeholder='描述' rows='5'>http://mtons.com/</textarea>
</div>
<div class='ui small input'>
<input data-regex-value='(^$)|(^(http|https):\/\/(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).*)|(^(http|https):\/\/[a-zA-Z0-9]+([_\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,10}(:[0-9]{1,10})?(\/.*)?$)' name='project[homepage]' placeholder='主页(eg: https://gitee.com)' type='text' value='mblog开源免费的博客系统, Java语言开发, 支持mysql/h2数据库, 采用spring-boot、jpa、shiro、bootstrap等流行框架开发'>
</div>
<button class='ui orange button mt-1 btn-save'>
保存更改
</button>
<div class='ui blank button btn-cancel-edit'>
取消
</div>
</div>
</div>
<div class='side-item release'>
<div class='header'>
<h4>
发行版
<span class='text-muted'>
(4)
</span>
</h4>
<a class="ui link button pull-right" href="/mtons/mblog/releases">全部</a>
</div>
<div class='content ml-3'>
<i class='iconfont icon-release'></i>
<div class='desc'>
<a href="/mtons/mblog/releases/3.5.0">3.5.0-release</a>
</div>
<span class='timeago' datetime='2020-05-14 15:12' title='2020-05-14 15:12:17 +0800'></span>
</div>
</div>
<div class='side-item radar'>
<div class='header mb-1'>
<h4>Gitee 指数</h4>
<a class="ui link button radar-qa" href="javascript:void(0);"><i class='iconfont icon-help-circle'></i>
</a></div>
<div class='content'>
<div data-url='/mtons/mblog/project_radars' id='metrics-radar'>
<div class='wrap skeleton'>
<div class='total-score hide'>
<div class='text'></div>
<div class='score'></div>
</div>
</div>
<div class='ui popup radar-popup'>
<div class='project-radar-list'>
<div class='descript-contianer'>
<div class='descript-title'>
<p>代码活跃度</p>
<p>社区活跃度</p>
<p>团队健康</p>
<p>流行趋势</p>
<p>影响力</p>
</div>
<div class='descript'>
<p>：与代码提交频次相关</p>
<p>：与项目和用户的issue、pr互动相关</p>
<p>：与团队成员人数和稳定度相关</p>
<p>：与项目近期受关注度相关</p>
<p>：与项目的star、下载量等社交指标相关</p>
</div>
</div>
</div>
<div class='finaltime'></div>
</div>
</div>
<script src="https://assets.gitee.com/assets/skill_radar/rep_app-706dadba450e9069b98e67a7c629a901.js"></script>

</div>
</div>
<div class='side-item contrib' data-url='/mtons/mblog/contributors_count?ref=master' id='contributor'>
<div class='header'>
<h4>
贡献者
<span class='text-muted' id='contributor-count'></span>
</h4>
<a class="ui link button pull-right" href="/mtons/mblog/contributors?ref=master">全部</a>
</div>
<div class='content' id='contributor-list'></div>
<div class='ui active centered inline loader' id='contributor-loader'></div>
</div>
<div class='side-item events' data-url='/mtons/mblog/events.json' id='events'>
<div class='header'>
<h4>近期动态</h4>
</div>
<div class='content'>
<div class='ui comments' id='event-list'></div>
<a class="loadmore hide" href="javascript:void(0);">加载更多
<i class='icon dropdown'></i>
</a><center>
<div class='text-muted nomore hide'>不能加载更多了</div>
<div class='ui inline loader active'></div>
</center>
</div>
</div>
</div>
<script>
  window.gon.projectRightSide = {
    homepage: "http://mtons.com/",
    description: "mblog开源免费的博客系统, Java语言开发, 支持mysql/h2数据库, 采用spring-boot、jpa、shiro、bootstrap等流行框架开发",
    url: "/mtons/mblog/update_description"
  }
  
  $('#license-popup').popup({ position: 'bottom center', lastResort: 'bottom center' })
</script>

</div>
</div>
</div>
<style>
  .team-member-checkbox .ui.radio.checkbox.checked label:after {
    top: 7px !important; }
</style>

</div>
<script>
  (function() {
    var donateModal;
  
    Gitee.modalHelper = new GiteeModalHelper({
      alertText: '提示',
      okText: '确定'
    });
  
    donateModal = new ProjectDonateModal({
      el: '#project-donate-modal',
      alipayUrl: '/mtons/mblog/alipay',
      wepayUrl: '/mtons/mblog/wepay',
      nameIsBlank: '名称不能为空',
      nameTooLong: '名称过长（最多为 36 个字符）',
      modalHelper: Gitee.modalHelper
    });
  
    if (null === 'true') {
      donateModal.show();
    }
  
    $('#project-donate').on('click', function() {
      return donateModal.show();
    });
  
  }).call(this);
</script>
<script>
  Tree.initHighlightTheme('white')
</script>


</div>
<div class='gitee-project-extension'>
<div class='extension lang'>Java</div>
<div class='extension public'>1</div>
<div class='extension https'>https://gitee.com/mtons/mblog.git</div>
<div class='extension ssh'>git@gitee.com:mtons/mblog.git</div>
<div class='extension namespace'>mtons</div>
<div class='extension repo'>mblog</div>
<div class='extension name'>mblog</div>
<div class='extension branch'>master</div>
</div>

<script>
  $(function() {
    GitLab.GfmAutoComplete.dataSource = "/mtons/mblog/autocomplete_sources"
    GitLab.GfmAutoComplete.Emoji.assetBase = '/assets/emoji'
    GitLab.GfmAutoComplete.setup();
  });
</script>

<footer id='git-footer-main'>
<div class='ui container'>
<div class='logo-row'>
<img class='logo-img' src='/static/images/logo-black.svg?t=158106666'>
</div>
<div class='name-important'>
深圳市奥思网络科技有限公司版权所有
</div>
<div class='ui two column grid d-flex-center'>
<div class='nine wide column git-footer-left'>
<div class='ui four column grid' id='footer-left'>
<div class='column'>
<div class='ui link list'>
<div class='item'>
<a class="item" href="/about_us">关于我们</a>
</div>
<div class='item'>
<a class="item" href="/terms">使用条款</a>
</div>
<div class='item'>
<a class="item" href="/oschina/git-osc/issues">意见建议</a>
</div>
<div class='item'>
<a class="item" href="/links.html">合作伙伴</a>
</div>
</div>
</div>
<div class='column'>
<div class='ui link list'>
<div class='item'>
<a class="item" href="/all-about-git">Git 大全</a>
</div>
<div class='item'>
<a class="item" href="https://oschina.gitee.io/learn-git-branching/">Git 命令学习</a>
</div>
<div class='item'>
<a class="item" href="https://copycat.gitee.com/">代码克隆检测</a>
</div>
<div class='item'>
<a class="item" href="/appclient">APP与插件下载</a>
</div>
</div>
</div>
<div class='column'>
<div class='ui link list'>
<div class='item'>
<a class="item" href="/gitee-stars">Gitee 封面人物</a>
</div>
<div class='item'>
<a class="item" href="/gvp">GVP 项目</a>
</div>
<div class='item'>
<a class="item" href="https://blog.gitee.com/">Gitee 博客</a>
</div>
<div class='item'>
<a class="item" href="/enterprises#nonprofit-plan">Gitee 公益计划</a>
</div>
</div>
</div>
<div class='column'>
<div class='ui link list'>
<div class='item'>
<a class="item" href="/api/v5/swagger">OpenAPI</a>
</div>
<div class='item'>
<a class="item" href="/help">帮助文档</a>
</div>
<div class='item'>
<a class="item" href="/self_services">在线自助服务</a>
</div>
<div class='item'>
<a class="item" href="/git-osc">更新日志</a>
</div>
</div>
</div>
</div>
</div>
<div class='seven wide column right aligned followus git-footer-right'>
<div class='qrcode weixin'>
<img alt="Qrcode weixin" src="https://assets.gitee.com/assets/qrcode-weixin-9e7cfb27165143d2b8e8b268a52ea822.jpg" />
<p class='weixin-text'>微信服务号</p>
</div>
<div class='phone-and-qq column'>
<div class='ui list official-support-container'>
<div class='item'>
<a class="icon-popup" href="//shang.qq.com/wpa/qunwpa?idkey=df785aa7af71f7d74149ab062742d761b845464350ecba25eb440357a3e573b7" title="点击加入 Gitee 官方群"><i class='iconfont icon-logo-qq'></i>
<span>官方技术交流QQ群：1050025484</span>
</a></div>
<div class='item mail-and-zhihu'>
<a href="mailto: git@oschina.cn"><i class='iconfont icon-msg-mail'></i>
<span id='git-footer-email'>git#oschina.cn</span>
</a></div>
<div class='item mail-and-zhihu'>
<a href="https://www.zhihu.com/org/ma-yun-osc/" target="_blank"><i class='iconfont icon-zhihu'></i>
<span>Gitee</span>
</a></div>
<div class='item tel'>
<a>
<i class='iconfont icon-tel'></i>
<span>售前及售后使用咨询：400-606-0201</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class='bottombar'>
<div class='ui container'>
<div class='ui d-flex d-flex-between'>
<div class='seven wide column partner d-flex'>
<div class='open-atom d-flex-center'>
<img alt="Logo openatom" class="logo-openatom mr-1" src="https://assets.gitee.com/assets/logo-openatom-d083391cc8a54e283529f3fc11cc38ca.svg" />
<a href="https://www.openatom.org/" target="_blank">开放原子开源基金会</a>
<div class='sub-title ml-1'>认证代码托管平台</div>
</div>
<div class='report-12377 d-flex-center ml-3'>
<img alt="12377@2x" class="report-12377__logo mr-1" src="https://assets.gitee.com/assets/12377@2x-1aa42ed2d2256f82a61ecf57be1ec244.png" />
<a href="https://12377.cn" target="_blank">违法和不良信息举报中心</a>
</div>
<div class='copyright ml-3'>
<a href="http://www.beian.miit.gov.cn/">粤ICP备12009483号</a>
</div>
</div>
<div class='nine wide column right aligned'>
<i class='icon world'></i>
<a href="/language/zh-CN">简 体</a>
/
<a href="/language/zh-TW">繁 體</a>
/
<a href="/language/en">English</a>
</div>
</div>
</div>
</div>
</footer>
<script>
  var officialEmail = $('#git-footer-email').text()
  $('#git-footer-main .icon-popup').popup({ position: 'bottom center' })
  $('#git-footer-email').text(officialEmail.replace('#', '@'))
  window.gon.popover_card_locale = {
    follow:"关注",
    unfollow:"已关注",
    gvp_title: "GVP - Gitee 最有价值开源项目",
    project: "项目",
    org: "开源组织",
    member: "",
    author: "作者",
    user_blocked: "该用户已被屏蔽或已注销",
    net_error: "网络错误",
    unknown_exception: "未知异常"
  }
</script>
<script src="https://assets.gitee.com/webpacks/popover_card-f8f6dbb28615dcff05a9.bundle.js"></script>


<div class='side-toolbar'>
<div class='button toolbar-help'>
<i class='iconfont icon-help'></i>
</div>
<div class='ui popup left center dark'>点此查找更多帮助</div>
<div class='toolbar-help-dialog'>
<div class='toolbar-dialog-header'>
<h3 class='toolbar-dialog-title'>搜索帮助</h3>
<form accept-charset="UTF-8" action="/help/load_keywords_data" class="toolbar-help-search-form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>
<div class='ui icon input fluid toolbar-help-search'>
<input name='keywords' placeholder='请输入产品名称或问题' type='text'>
<i class='icon search'></i>
</div>
</form>

<i class='iconfont icon-close toolbar-dialog-close-icon'></i>
</div>
<div class='toolbar-dialog-content'>
<div class='toolbar-help-hot-search'>
<div class='toolbar-roll'>
<a class="init active" href="https://oschina.gitee.io/learn-git-branching/?utm_source==gitee-help-widget" title="Git 命令在线学习"><i class='Blue icon icon-command iconfont'></i>
<span>Git 命令在线学习</span>
</a><a class="init " href="https://gitee.com/help/articles/4261?utm_source==gitee-help-widget" title="如何在 Gitee 导入 GitHub 仓库"><i class='icon icon-clipboard iconfont orange'></i>
<span>如何在 Gitee 导入 GitHub 仓库</span>
</a></div>
<div class='toolbar-list'>
<div class='toolbar-list-item'>
<a href="/help/articles/4114">Git 仓库基础操作</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4166">企业版和社区版功能对比</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4191">SSH 公钥设置</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4194">如何处理代码冲突</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4232">仓库体积过大，如何减小？</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4279">如何找回被删除的仓库数据</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4283">Gitee 产品配额说明</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4284">GitHub仓库快速导入Gitee及同步更新</a>
</div>
<div class='toolbar-list-item'>
<a href="/help/articles/4328">什么是 Release（发行版）</a>
</div>
</div>
</div>
<div class='toolbar-help-search-reseult'>
<div class='toolbar-help-flex-column'>
<div class='ui centered inline loader toolbar-help-loader'></div>
<div class='toolbar-list'></div>
<div class='toolbar-help-link-to-help'>
<a href="" target="_blank">查看更多搜索结果</a>
</div>
</div>
</div>
</div>
</div>
<script>
  var opt = { position: 'left center'};
  var $helpSideToolbar = $('.button.toolbar-help');
  var $toolbarRoll = $('.toolbar-roll');
  
  $(function() {
    if (false) {
      $helpSideToolbar.popup(opt).popup({lastResort:'left center'})
    } else {
      $helpSideToolbar.popup({lastResort:'left center'}).popup('show', opt);
      setTimeout(function() {
        $helpSideToolbar.popup('hide', opt);
      }, 3000);
    }
  
    if ($toolbarRoll.length) {
      setInterval(function() {
        var $nextActiveLink = $toolbarRoll.find('a.active').next();
        if (!$nextActiveLink.length) {
          $nextActiveLink = $toolbarRoll.find('a:first-child');
        }
        $nextActiveLink.attr('class', 'active').siblings().removeClass('active init');
      }, 5000);
    }
  })
</script>

<div class='button share-link'>
<i class='iconfont icon-share'></i>
</div>
<div class='ui popup dark'>
<div class='header'>
分享到
</div>
<div class='bdsharebuttonbox' style='display: flex'>
<a class='iconfont icon-home-service-wechat' data-cmd='weixin' title='分享到微信'></a>
<a class='iconfont icon-weibo' data-cmd='tsina' title='分享到新浪微博'></a>
<a class='iconfont icon-qq' data-cmd='sqq' title='分享到QQ好友'></a>
<a class='iconfont icon-qzone' data-cmd='qzone' title='分享到QQ空间'></a>
</div>
</div>
<div class='popup button' id='home-comment'>
<i class='iconfont icon-comment'></i>
</div>
<div class='ui popup dark'>评论</div>
<div class='toolbar-appeal popup button'>
<i class='iconfont icon-report'></i>
</div>
<div class='ui popup dark'>
仓库举报
</div>
<script>
  $('.toolbar-appeal').popup({ position: 'left center' });
</script>

<div class='button gotop popup' id='gotop'>
<i class='iconfont icon-top'></i>
</div>
<div class='ui popup dark'>回到顶部</div>
</div>
<div class='form modal normal-modal tiny ui' id='unlanding-complaint-modal'>
<i class='iconfont icon-close close'></i>
<div class='header'>
登录提示
</div>
<div class='container actions'>
<div class='content'>
该操作需登录 Gitee 帐号，请先登录后再操作。
</div>
<div class='ui orange icon large button ok'>
立即登录
</div>
<div class='ui button blank cancel'>
没有帐号，去注册
</div>
</div>
</div>
<script>
  var $elm = $('.toolbar-appeal');
  
  $elm.on('click', function() {
    var modals = $("#unlanding-complaint-modal.normal-modal");
    if (modals.length > 1) {
      modals.eq(0).modal('show');
    } else {
      modals.modal('show');
    }
  })
  $("#unlanding-complaint-modal.normal-modal").modal({
    onDeny: function() {
      window.location.href = "/signup?from=";
    },
    onApprove: function() {
      window.location.href = "/login?from=";
    }
  })
</script>

<style>
  .side-toolbar .bdsharebuttonbox a {
    font-size: 24px;
    color: white !important;
    opacity: 0.9;
    margin: 6px 6px 0px 6px;
    background-image: none;
    text-indent: 0;
    height: auto;
    width: auto;
  }
  
  #enterprises-index #udesk_btn a{
    margin: 0px 20px 217px 0px !important;
  }
</style>
<script>
  (function() {
    $('#project-user-message').popup({
      position: 'left center'
    });
  
  }).call(this);
</script>
<script>
  Gitee.initSideToolbar({
    hasComment: true,
    commentUrl: '/mtons/mblog#tree_comm_title'
  })
</script>
<script>
  window._bd_share_config = {
    "common": {
      "bdSnsKey": {},
      "bdText": document.title,
      "bdMini": "1",
      "bdMiniList": ["bdxc","tqf","douban","bdhome","sqq","thx","ibaidu","meilishuo","mogujie","diandian","huaban","duitang","hx","fx","youdao","sdo","qingbiji","people","xinhua","mail","isohu","yaolan","wealink","ty","iguba","fbook","twi","linkedin","h163","evernotecn","copy","print"],
      "bdPic": "",
      "bdStyle": "1",
      "bdSize": "32"
    },
    "share": {}
  }
</script>
<script src="/bd_share/static/api/js/share.js"></script>



<style>
  .gitee-stars-main-widget {
    display: none;
    position: fixed;
    left: 0;
    bottom: 0;
    z-index: 106; }
    .gitee-stars-main-widget .close-icon {
      position: absolute;
      top: 5px;
      cursor: pointer; }
    .gitee-stars-main-widget .people-image {
      width: 200px;
      padding: 0 10px; }
  
  .gitee-stars-main-widget.pendan-widget .close-icon {
    right: 20px; }
  .gitee-stars-main-widget.gitee-stars-widget .close-icon {
    left: 20px; }
</style>
<div class='gitee-stars-main-widget pendan-widget'>
<a href="https://www.wjx.cn/jq/99362743.aspx" target="_blank"><img alt="152606 8668e384 1899542" class="people-image" src="https://images.gitee.com/uploads/images/2020/1204/152606_8668e384_1899542.png" />
<img alt="133635 2cd7d36e 1899542" class="close-icon" src="https://images.gitee.com/uploads/images/2020/1204/133635_2cd7d36e_1899542.png" />
</a></div>
<script>
  $(function () {
    var $giteeStarsWidget = $('.gitee-stars-main-widget')
    var cookieKey = "visit-gitee--2020-12-04 15:26:57 +0800"
  
    if ($.cookie(cookieKey) == 1) {
      $giteeStarsWidget.hide()
    } else {
      $giteeStarsWidget.show()
    }
  
    $giteeStarsWidget.on('click', '.close-icon', function (e) {
      e.preventDefault()
      $.cookie(cookieKey, 1, {path: '/', expires: 60})
      $giteeStarsWidget.hide()
    })
  })
</script>


<script>
  (function() {
    this.__gac = {
      domain: 'www.oschina.net'
    };
  
  }).call(this);
</script>
<script defer src='//www.oschina.net/public/javascripts/cjl/ga.js?t=20160926' type='text/javascript'></script>

<script src="https://assets.gitee.com/assets/bdstatic/app-070a9e339ac82bf2bf7ef20375cd4121.js"></script>
</body>
</html>
